打印
[技术问答]

非自锁按键控制PWM占空比变化的问题

[复制链接]
1487|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
安娜12345|  楼主 | 2017-9-20 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想写的程序是根据两个按键SW1,SW2的按下次数控制输出PWM的占空比
主程序如下:
INT32 main(VOID)
{
        UINT8 ucRecord=0; //记录SW1按下的奇偶次,按下奇次时为1,按下偶次时为0,即按键SW1控制PWM波的输出与否
        INT32 ucSpeed=0;

        KeyInit(); //按键SW1(P3.2口),SW2(P3.6口)的初始化
       
        LEDShowInit(); //用于显示的LED灯的初始化
       
        /*PWM初始化,输出频率为10kHz*/
        PWMInit();//用到PWM2345,即单片机要输出四路PWM波
               
        TMR0Init(); //定时器0初始化,设计程序每隔20ms扫描一次按键,20ms的间隔用定时器中断实现
       
        while(1)
        {
                /*每隔20ms进行一次按键检测*/
                if(g_bTimer0IRQEvent)
                {
                        g_bTimer0IRQEvent = 0; //进入定时器中断函数
                       
                        ucRecord = KeyRead(); //按键扫描函数,检测SW1,SW2是否按下,SW1和SW2按下时ucRecord的第2位
                                                             //和第六位分别为1

                        if(ucRecord)  //如果有按键按下
                        {
                                 if(ucRecord & (1<<2)) //如果SW1按下
                                 {
                                         if(ucSpeed)     //如果SW1之前按下过(按下偶数次)
                                         {
                                                 ucSpeed = 0;  //PWM停止输出控制
                                         }
                                         else
                                         {
                                                 ucSpeed = 1; //如果SW1之前未按下过(按下奇数次),PWM开始输出
                                         }
                                 }
                                 if((ucRecord & (1<<6)) && (ucSpeed)) //如果SW2按下,且SW1按下奇数次,
                                                                                             //即PWM是允许输出状态
                                 {
                                         ucSpeed = ucSpeed + 1; //SW2按键用于控制改变占空比,此时改变ucSpeed值表示切换占空比
                                         ucSpeed = ucSpeed % 4;//设置三种PWM波占空比模式
                                         if(!ucSpeed)
                                         {
                                                 ucSpeed = 1;    //多次按下SW2时,三种PWM波占空比模式循环设置
                                         }
                                 }
                        }
                       
                        switch(ucSpeed)
                        {
                                case 0: //PWM波停止输出状态
                                {
                                        CMR2A = 0;
                                        CMR3A = 0;
                                        CMR0B = 0;
                                        CMR1B = 0;
                                }break;
                                case 1://占空比40%
                                {
                                        CMR2A = 96;//PWM2,PWM为中心对齐模式
                                        CMR3A = 96;
                                        CMR0B = 144; //PWM4,PWM45设置为反向输出,实现PWM23和PWM45之间的180度相位差
                                        CMR1B = 144;
                                        P0_DOUT &=~ (1<<1); //点亮LED6
                                        P3_DOUT |= (3<<4);  //LED78灭
                                }break;
                                case 2://占空比60%
                                {
                                        CMR2A = 144;//PWM2
                                        CMR3A = 144;
                                        CMR0B = 96; //PWM4
                                        CMR1B = 96;
                                        P0_DOUT |= (1<<1);
                                        P3_DOUT &=~ (1<<4);  //LED7亮
                                        P3_DOUT |= (1<<5);
                                }break;
                                case 3://占空比80%
                                {
                                        CMR2A = 192;//PWM2
                                        CMR3A = 192;
                                        CMR0B = 48; //PWM4
                                        CMR1B = 48;
                                        P0_DOUT |= (1<<1);
                                        P3_DOUT |= (1<<4);
                                        P3_DOUT &=~ (1<<5); //LED8亮
                                }break;
                                default:break;
                        }
                }               
        }
}

问题,该程序烧写到板子上的时候,按下SW1键,松开瞬间LED6会亮,然后就一直不亮了。按下SW1后,再按SW2时板子没有任何反应,即LED78均不会亮。
程序中,有if语句判断,理论上应该是,在没有按键按下时,ucRecord为0,不进入if语句,那么各参数的配置不会变,也就是,LED灯可以一直亮,但从板子实现来看,好像是各参数的值在每次循环中都会初始化
求解决办法(完整的工程在附件中,程序是在keil4上写的)

MOTOR20170919.zip

246.53 KB

相关帖子

沙发
Bruing| | 2017-9-20 21:10 | 只看该作者
和你的逻辑设计有关系,和mcu没关系。应该是定时器函数和主函数的逻辑没有处理好。按下一次按键后,看看定时器还在跑吗?按键的状态监测不起作用了是

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝