打印

单片机产生的方波为什么有毛刺?

[复制链接]
14316|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kokoromi|  楼主 | 2011-1-20 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用单片机的比较输出模块产生一个方波,单片机用的是PIC24HJ128GP202,问题是,输出的方波总是有毛刺,毛刺出现在上升沿的顶端和下降沿的底端,方波的频率越高,毛刺越严重,请教各位大侠这是什么原因啊,怎么才能解决?

PS:我用晶振经过CD4060分频产生的方波就一点毛刺都没有,但是我需要用单片机来控制频率的所以没法用这个方法...
沙发
庄庄| | 2011-1-20 09:52 | 只看该作者
单片机应该不会输出毛刺,把毛刺的波形贴出来看看,也可以看看是不是外围电路的问题

使用特权

评论回复
板凳
ddb_21ic| | 2011-1-20 09:55 | 只看该作者
串个小电阻

使用特权

评论回复
地板
kokoromi|  楼主 | 2011-1-20 10:48 | 只看该作者
2# 庄庄

示波器的图暂时弄不出来...我用了MSP430的单片机和PIC的单片机,都是这个问题,频率越高毛刺越严重,外面什么都没接...

使用特权

评论回复
5
庄庄| | 2011-1-20 10:53 | 只看该作者
用示波器测一下你的电源,看看电源怎么样,我用过PIC单片机,PWM没有毛刺

使用特权

评论回复
6
kokoromi|  楼主 | 2011-1-21 11:34 | 只看该作者
多谢~ 我再找找原因吧

使用特权

评论回复
7
兰天白云| | 2011-1-21 12:48 | 只看该作者
1:如果每个波形都有毛刺,可能是频率太高,上升沿或下降沿太陡引起,解决措施加一个小小电容
2:如果部分波形有毛刺,可能是占空比改变时机不对,解决措施,调整程序,在上一个波形结束后改占空比

使用特权

评论回复
8
kokoromi|  楼主 | 2011-1-21 14:21 | 只看该作者
7# 兰天白云

每个波形都有毛刺,频率越高毛刺越大,用CD4060分频晶振得到的方波就没这个问题,一点毛刺都没有,我把示波器的周期都调到最小4nS一格都看不到毛刺,很纳闷。。。

使用特权

评论回复
9
diweo| | 2011-1-22 16:37 | 只看该作者
有没有把单片机输出和后级断开,直接测一下端口波形呢?

使用特权

评论回复
10
兰天白云| | 2011-1-23 14:17 | 只看该作者
按9楼方法测试,应该没有毛刺,如果由于电路原因引起,可加电容解决

使用特权

评论回复
11
kokoromi|  楼主 | 2011-1-24 08:15 | 只看该作者
9# diweo

试过了,都是一样的。

使用特权

评论回复
12
diweo| | 2011-1-24 08:28 | 只看该作者
这个问题倒真有点奇怪了

使用特权

评论回复
13
kokoromi|  楼主 | 2011-1-24 08:53 | 只看该作者
12# diweo

还有更奇怪的了,我用了MSP430单片机的比较输出模块试了一下,也是这个问题...是不是单片机输出的方波都有这个毛病啊...

使用特权

评论回复
14
兰天白云| | 2011-1-24 09:14 | 只看该作者
PIC24本人没用过,本人用PIC16产生PWM信号,无毛刺

使用特权

评论回复
15
diweo| | 2011-1-24 09:23 | 只看该作者
试试看这段代码
//例13-6: 设置输出比较模块工作在PWM 模式下
// Initialize Output Compare Module
OC1CONbits.OCM = 0b000; // Disable Output Compare Module
OC1R = 100; // Write the duty cycle for the first PWM pulse
OC1RS = 200; // Write the duty cycle for the second PWM pulse
OC1CONbits.OCTSEL = 0; // Select Timer 2 as output compare time base
OC1R = 100; // Load the Compare Register Value
OC1CONbits.OCM = 0b110; // Select the Output Compare mode
// Initialize and enable Timer2
T2CONbits.TON = 0; // Disable Timer
T2CONbits.TCS = 0; // Select internal instruction cycle clock
T2CONbits.TGATE = 0; // Disable Gated Timer mode
T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler
TMR2 = 0x00; // Clear timer register
PR2 = 500; // Load the period value
IPC1bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level
IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag
IEC0bits.T2IE = 1; // Enable Timer 2 interrupt
T2CONbits.TON = 1; // Start Timer
/* Example code for Timer 2 ISR*/
void __attribute__((__interrupt__, no_auto_psv)) _T2Interrupt( void )
{
/* Interrupt Service Routine code goes here */
OC1RS = 300; // Write Duty Cycle value for next PWM cycle
IFS0bits.T2IF = 0; // Clear Timer 2 interrupt flag
}

使用特权

评论回复
16
guihaiyuanfeng| | 2011-1-24 10:09 | 只看该作者
加个小电阻

使用特权

评论回复
17
yewuyi| | 2011-1-24 10:44 | 只看该作者
检测PWM部分的相关代码。
也许你的PWM在发送时,你存在修改PWM相关设置的代码,例如PWM相关IO口输入输出的错误操作会造成PWM一会关闭一会打开。

另外,检查示波器探针是否校正!?如果示波器探针上的负载电容没有正确校正,也会造成波形存在失真。

使用特权

评论回复
18
maxiuyang| | 2011-1-26 12:16 | 只看该作者
看看电源

使用特权

评论回复
19
21passteenic| | 2011-1-28 11:31 | 只看该作者
你的电路中存在容性或者感性的负载,如果这种负载一定需要,就增加隔离电路

使用特权

评论回复
20
独来独往| | 2013-5-31 11:45 | 只看该作者
你好,请问你这个问题解决了吗?目前我也遇到该问题,我的PWM的频率是1K,上升沿、下降沿都有尖峰,但是PWM的频率降到30Hz后,基本上波形的上升沿和下降沿都看不到。串个匹配电阻可以解决高频时候的尖峰问题,但是通过后级的IC后又出来了,我怀疑是IC都有这个问题!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

344

帖子

3

粉丝