本帖最后由 ysisi2006 于 2013-5-27 14:45 编辑
我用PIC16LF1508的pwm3模块(17脚,RA2)产生的一个38K方波,然后接一个三极管去驱动一个红外发射二极管。结果测得波形有很多的毛刺很不稳定。驱动电路见图
该如何滤除毛刺呢,在单片机输出脚和地之间加104电容也不行,三极管集电极和发射管的阴极间串磁珠也不行,单片机输出脚和限流的1K电阻之间串磁珠也不行,该如何路出毛刺啊?
还有,在不需要产生方波的时候关闭了pwm模块之后,我将RA2置0,可是RA2脚输出始终为1,这又是为什么呢?
PWM相关部分程序:
void port_init()
{
//PORTA端口的设置
nWPUEN=1;//所有端口的弱上拉功能都被禁止
WPUA1=0;//RA1端口的弱上拉功能被禁止
ADCON0|=0x30;//不连接任何AD通道;
ADCON0&=0xb2;//不连接任何AD通道,ADON=0;
ADCON2&=0x0f;//未选择任何自动转换触发源;
ANSA2=0;//数字I/O。引脚被配置为端口或数字特殊功能。
RA2=0;//RA2红外管的IO线;PWM3引脚
TRISA2=0;
}
void pwm3_init()//pwm3初始化,开始输出38kHz的方波
{
TRISA2=1;//通过将相关的TRIS位置1,禁止PWMx 引脚输出驱动器。
PWM3CON=0;//清零PWMxCON 寄存器。
PR2=25;//将PWM 周期值装入PR2 寄存器,周期为26us
PWM3DCH=0;//清零PWMxDCH 寄存器和PWMxDCL 寄存器的bit <7:6>。
PWM3DCL=0;
//配置Timer2:
TMR2IF=0;//清零PIR1 寄存器的TMR2IF 中断标志位
T2CON=0;//用Timer2 预分频值配置T2CON 寄存器的T2CKPS 位。
TMR2=0;
TMR2ON=1;//通过将T2CON 寄存器的TMR2ON 位置1 来使能Timer2。
PWM3CON=0xd0;//使能PWM 输出引脚
while(TMR2IF==0);//等待直到Timer2 溢出
RA2=0;//未开启方波发送,先送0
TRISA2=0;//通过将关联的TRIS位清零//将PWMxCON寄存器的PWMxOE 位置1,使能PWMx 引脚输出驱动器。
PWM3OE=1;//将PWMxCON寄存器的PWMxOE 位置1,使能PWMx 引脚输出驱动器。
PWM3DCH=0x0d;//设置占空比
PWM3DCL=0;
}
void pwm3_close()
{
TMR2ON=0;
TMR2=0;
TMR2IF=0;
PWM3CON=0x10;
RA2=0;
}
|