衰不堪言 发表于 2015-6-16 09:42:32

用PCA输出PWM,timer0为时钟源,波形失真严重

这是波形,求解

leafstamen 发表于 2015-6-16 09:53:47

把电容去了

衰不堪言 发表于 2015-6-16 10:03:41

leafstamen 发表于 2015-6-16 09:53
把电容去了

木有加电容

小李非刀 发表于 2015-6-16 11:29:30

有容性负载(这个基本是肯定的)

衰不堪言 发表于 2015-6-16 11:36:33

小李非刀 发表于 2015-6-16 11:29
有容性负载(这个基本是肯定的)

完全没有负载,这个是肯定的,我是断开负载,直接测的引脚
不过现在我测到供电电压低,才4.2几,等我提高供电电压再看

qq8682 发表于 2015-6-16 12:25:59

io设置对吗?

衰不堪言 发表于 2015-6-16 12:42:52

qq8682 发表于 2015-6-16 12:25
io设置对吗?

推挽输出

lyp103 发表于 2015-6-16 14:46:19

你的失真也太厉害了,是不是哪里没弄好?这个和电压没有关系,就算是双向口输出波形也不会这么差.你把程序贴个上来看看{:lol:}

饭桶 发表于 2015-6-16 15:04:24

输出配置成推挽了吗?

衰不堪言 发表于 2015-6-16 21:32:02

lyp103 发表于 2015-6-16 14:46
你的失真也太厉害了,是不是哪里没弄好?这个和电压没有关系,就算是双向口输出波形也不会这么差.你把程序贴个 ...

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 PCA输出6/7/8位PWM举例-------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序      */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序      */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include <STC15F2K60S2.h>
#include "intrins.h"

#define FOSC    11059200L

typedef unsigned char BYTE;
typedef unsigned int WORD;


sbit LED = P1^7;
#define CCP_S0 0x10               //P_SW1.4
#define CCP_S1 0x20               //P_SW1.5
WORD temp = 0;


void Timer2Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0xCD;                //设置定时初值
        T2H = 0xD4;                //设置定时初值
        AUXR |= 0x10;                //定时器2开始计时
        IE2 |= 0x04;
        EA =1;
}

void Timer0Init(void)                //100微秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = (65536-FOSC/5000/265);                //设置定时初值
        TH0 = (65536-FOSC/5000/265)>>8;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

void T0I(void) interrupt 12
{
        temp++;
       
        if(temp>800)
        {
                LED = ~LED;
                temp = 0;
                CCAP0H++;
                if(CCAP0L>256)
                {
                CCAP0H = 0;
                }
//                CCAP0H = CCAP0L;
        }       
}

void main()
{
//   ACC = P_SW1;
//    ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
//    P_SW1 = ACC;
P3M1 = 0x00;
P3M0 = 0xff;                  //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
Timer2Init();
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
P_SW1 = ACC;
//
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
//ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
//P_SW1 = ACC;

    CCON = 0;                     //初始化PCA控制寄存器
                                    //PCA定时器停止
                                    //清除CF标志
                                    //清除模块中断标志
    CL = 0;                         //复位PCA寄存器
    CH = 0;
    CMOD = 0x04;                  //设置PCA时钟源
    Timer0Init();                              //禁止PCA定时器溢出中断
    PCA_PWM0 = 0x00;                //PCA模块0工作于8位PWM
    CCAP0H = 0x00;         //PWM0的占空比为87.5% ((100H-20H)/100H)
    CCAPM0 = 0x42;                  //PCA模块0为8位PWM模式

    PCA_PWM1 = 0x40;                //PCA模块1工作于7位PWM
    CCAP1H = CCAP1L = 0xff;         //PWM1的占空比为75% ((80H-20H)/80H)
    CCAPM1 = 0x42;                  //PCA模块1为7位PWM模式

    PCA_PWM2 = 0x80;                //PCA模块2工作于6位PWM
    CCAP2H = CCAP2L = 0x20;         //PWM2的占空比为50% ((40H-20H)/40H)
    CCAPM2 = 0x42;                  //PCA模块2为6位PWM模式

    CR = 1;                         //PCA定时器开始工作

    while (1);
}




这是照抄STC例程,自己又改了点

error_dan 发表于 2015-6-16 21:40:21

只有一个问题,LZ你示波器怎么接的?测量仪器也是负载...

衰不堪言 发表于 2015-6-16 21:43:12

error_dan 发表于 2015-6-16 21:40
只有一个问题,LZ你示波器怎么接的?测量仪器也是负载...

就是夹子夹到单片机电源负极,探头触到输出引脚

kinoko 发表于 2015-6-17 07:48:28

if(CCAP0L>256)               {               CCAP0H = 0;               }

衰不堪言 发表于 2015-6-17 22:03:27

kinoko 发表于 2015-6-17 07:48
if(CCAP0L>256)               {               CCAP0H = 0;               }

这块是有错误,但是不是造成失真的原因,CCAP0L是和CCAP0H相关联的,这么写是不对

xly 发表于 2015-6-17 22:18:19

你也可以试下那个时钟分频后直接IO输出,根本高低电平不对称,也就是占空比不为50%。 STC小问题还是挺多的。

小李非刀 发表于 2015-6-19 14:17:12

STC的1T系列的IO输出信号边沿一般为10~20ns,如果输出太窄的脉冲,比如1us高,可能会稍小一点。

衰不堪言 发表于 2015-6-19 16:38:26

小李非刀 发表于 2015-6-19 14:17
STC的1T系列的IO输出信号边沿一般为10~20ns,如果输出太窄的脉冲,比如1us高,可能会稍小一点。 ...

图片上可以看到,频率不到5K

chenchaoting 发表于 2015-6-19 19:39:08

楼主示波器探头校准了么
页: [1]
查看完整版本: 用PCA输出PWM,timer0为时钟源,波形失真严重