qqtfh 发表于 2012-9-5 23:17:08

M16输出PWM有行刺,求指教!

使用的是M16,8MHZ内部RC,与PWM部分相关的代码如下:
#define PWMDDRDDRD
#define PWMPORPORTD
#define PWM1    7
#define PWM2    5
#define PWM3    4

#define PWM1_data OCR2
#define PWM2_data OCR1A
#define PWM3_data OCR1B
#define PWM_MAX   100

volatile unsigned char APWM;
volatile unsigned char BPWM;
volatile unsigned char CPWM;

void pwm_init(void)
{
        APWM=0;BPWM=0;CPWM=0;
        PWMDDR|=1<<PWM1|1<<PWM2|1<<PWM3;
       
        /*初始化PWM*/
        TCCR2|=1<<COM21|1<<WGM21|1<<WGM20|1<<CS22;// 匹配时清零(COM2A1:COM2A0)快速PWM模式(WGM22:21:20) PWM CLK/64
        OCR2=0;                                                                                       
        TCNT2=0;
       
        TCCR1A|=_BV(COM1A1)|_BV(COM1B1)|_BV(WGM10);//比较匹配时清零(COM1A1:COM1A0   COM1B1:COM1B0)
        TCCR1B|=_BV(CS11)|_BV(CS10)|_BV(WGM12);    //8位快速PWM(WGM10:11:12)   PWM CK/64
        OCR1A=0;
        OCR1B=0;
        /*初始化PWM*/
       
}
void PWM_OUT(unsigned char P1,unsigned char P2,unsigned char P3)
{
        const unsigned char PD=
        {
               0,5,6,7,8,9, 10, 11, 12, 13, 14,          //1
                        15, 16, 17, 18, 19, 20, 21, 22, 23, 24,          //2
                        25, 26, 27, 28, 29, 30, 31, 32, 33, 34,          //3
                        35, 36, 37, 38, 39, 40, 41, 42, 43, 44,          //4
                        45, 46, 47, 48, 49, 50, 51, 52, 53, 54,          //5
                        55, 56, 57, 58, 59, 60, 61, 62, 63, 64,          //6
                        66, 68, 70, 72, 74, 76, 78, 80, 82, 84,          //7
                        88, 92, 96,100,104,108,112,116,120,124,          //8
                   130,136,142,148,154,160,166,172,178,184,          //9
                   191,198,205,212,219,226,233,240,247,255   //10   
        };
        PWM1_data=PD;
        PWM2_data=PD;
        PWM3_data=PD;
}
void int main(void)
{
       pwm_init();
       while(1)
       {
            ……
             ……
            PWM_OUT(APWM,BPWM,CPWM);
      }
}

当 PWM_OUT(0,0,0);时,PWM相关引脚还是有毛刺出现。

BBC 发表于 2012-9-5 23:27:03

{:lol:} 请问你是用什么仪器来测试的?

请看我以前遇到的情况:http://www.amobbs.com/thread-5482177-1-1.html

cadre 发表于 2012-9-6 00:23:44

{:smile:}mark

qqtfh 发表于 2012-9-6 08:13:20

BBC 发表于 2012-9-5 23:27 static/image/common/back.gif
请问你是用什么仪器来测试的?

请看我以前遇到的情况:http://www.amobbs.com/thread-5482177-1-1 ...

您好!看了一下您的帖子,最后大概是认为是仪器的问题是吧?我用的是青岛汉泰的虚拟示波器DSO-5200A 200MHz 带宽,50G等效采样。能否作个总结?万分感谢!

xtxtt 发表于 2012-9-6 08:30:46

好像是占空比没有设置好哦!

qqtfh 发表于 2012-9-6 08:32:43

xtxtt 发表于 2012-9-6 08:30 static/image/common/back.gif
好像是占空比没有设置好哦!

求指正!

ahuang227 发表于 2012-9-6 10:08:03

占空比设成0,还是有1的占空比输出的,这个是正常的。

qqtfh 发表于 2012-9-6 10:10:18

ahuang227 发表于 2012-9-6 10:08 static/image/common/back.gif
占空比设成0,还是有1的占空比输出的,这个是正常的。

为什么会这样?

ahuang227 发表于 2012-9-6 10:12:44

虽然你设置成0 ,但是比较器比较两个值是要时间的,1个clock已经是很短的时间了。怎么也去不掉。

要是真的纠结,那就只能关断PWM输出才行。

qqtfh 发表于 2012-9-6 11:03:37

ahuang227 发表于 2012-9-6 10:12 static/image/common/back.gif
虽然你设置成0 ,但是比较器比较两个值是要时间的,1个clock已经是很短的时间了。怎么也去不掉。

要是真的 ...

我用过STC12C5608的PWM输出,PWM=0的时候,啥都没有哦。

BBC 发表于 2012-9-6 13:45:07

qqtfh 发表于 2012-9-6 08:13 static/image/common/back.gif
您好!看了一下您的帖子,最后大概是认为是仪器的问题是吧?我用的是青岛汉泰的虚拟示波器DSO-5200A 200M ...

{:lol:} 目前只发现USB口的逻辑分析仪会出现这种现象,其他仪器应该不会有~~也都不应该有...呵呵

qqtfh 发表于 2012-9-6 13:57:02

BBC 发表于 2012-9-6 13:45 static/image/common/back.gif
目前只发现USB口的逻辑分析仪会出现这种现象,其他仪器应该不会有~~也都不应该有...呵呵 ...

应该不是仪器的问题,我用STC12C5608的PWM做过输出,不存在这样的问题。

qqtfh 发表于 2012-9-6 19:48:33

本帖最后由 qqtfh 于 2012-9-6 19:49 编辑

问题已解决。给OCR2赋值之前判断值大小;如果等于0,就设置TCCR2&=~(1<<COM21|1<<COM20);OCR2当普通IO输出0;非0时,就重新设置TCCR2。感谢CCTV!感谢中央电视台!{:victory:}
页: [1]
查看完整版本: M16输出PWM有行刺,求指教!