用PIC单片机产生方波遇到这种波形
本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。求有经验的大神指导下
这是产生的4KHZ正常波形,占空比为50%
这是1KHZ有问题的波形,占空比为60%
主要的程序我也贴上来各位看一下
/********端口初始化函数********/
void init()
{
ANSELH=0x00; //设置B口为数字I/O口
OPTION_REG=0x00;
WPUB=0xFF; //设置B口弱上拉
INTCON=0x00; //关总中断
PIE1=0; //PIE1的中断禁止
PIE2=0; //PIE2的中断禁止
TRISB0=1;
TRISB1=1; //将RB1设置为输入口,按按键
TRISB2=1; //将RB2设置为输入口,按按键
TRISB3=1;
TRISB4=1;
RC1=0;
TRISC1=0; //脉宽调制输出引脚,设置为输出
}
/********PWM初始化函数********/
void PWM_Init()
{
PR2=249; //脉宽调制波形的周期为1000us
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
CCPR2L=0xB8; //脉宽调制波形的占空比初始值
}
/********键盘扫描函数******* */
void keyscan()
{
if(RB1==0) //如果是RB1键按下
{
delay_ms(5); //延时去抖
if(RB1==0) //确认是否有键按下
{
while(!RB1); //等待按键释放
CCP2CON=0x0C;
CCPR2L=0xB8; //80%占空比
TMR2ON=1;
}
}
if(RB2==0) //如果是RB2键按下
{
delay_ms(5); //延时去抖
if(RB2==0) //确认是否有键按下
{
while(!RB2); //等待按键释放
CCP2CON=0x0C;
CCPR2L=0x96; //60%占空比
TMR2ON=1;
}
}
if(RB0==0) //如果是RB0键按下
{
delay_ms(5); //延时去抖
if(RB0==0) //确认是否有键按下
{
while(!RB0); //等待按键释放
CCP2CON=0x00; //关PWM
TMR2ON=0; //禁止TMR2
//delay_ms(5);
RC1=0;
}
}
}
/********主函数********/
void main()
{
init(); //系统初始化
PWM_Init(); //脉冲宽度初始化
while(1)
{
keyscan(); //调用按键扫描处理脉宽因数
}
} 单片机常用问题吗? 远祥 发表于 2018-11-6 07:38
单片机常用问题吗?
这个是用PIC单片机产生PWM波,应该比较常见吧
页:
[1]