冯喆喆 发表于 2018-11-5 20:08:17

用PIC单片机产生方波遇到这种波形

本帖最后由 冯喆喆 于 2018-11-5 20:11 编辑

用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。求有经验的大神指导下
这是产生的4KHZ正常波形,占空比为50%



这是1KHZ有问题的波形,占空比为60%


冯喆喆 发表于 2018-11-5 20:14:34

主要的程序我也贴上来各位看一下

/********端口初始化函数********/
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:09

单片机常用问题吗?

冯喆喆 发表于 2018-11-6 14:45:37

远祥 发表于 2018-11-6 07:38
单片机常用问题吗?

这个是用PIC单片机产生PWM波,应该比较常见吧
页: [1]
查看完整版本: 用PIC单片机产生方波遇到这种波形