PIC16F73 PWM模块控制电机,RB5口接按键切换显示,运行中操作按键为什么会影响PWM输出

2019-03-25 18:51发布

  1. /*********初始化子程序**********************************************/
  2. void init()
  3. {
  4.   ADCON1=0x07;     //A口设定为数字口
  5.   TRISA=0x00;      //A口设为输出
  6.   PORTA=0x00;      //置A口为低电平
  7.   TRISB=0xff;      //B口设为输入
  8.   PORTB=0xFf;      //置B口为高电平
  9.   TRISC4=1;        //使能RC4脚为输入
  10.   RC4=0;
  11. //***定时器TMR0初始化***
  12.     T0CS=0;                //TMRO时钟源选择内部指令周期时钟(Fosc/4)
  13.     PSA=0;                 //预分频器分配给TMR0模块
  14.     PS0=0;                 //TMR0预分频比1:8,PS0=0
  15.     PS1=1;                 //TMR0预分频比1:8,PS1=1
  16.     PS2=0;                 //TMR0预分频比1:8,PS2=0
  17.     TMR0=0x83;             //定时1000微秒,置初值为256-125+13
  18.     T0IF=0;                //清除TMR0的中断标志
  19.     T0IE=1;                //TMR0中断允许
  20. //***捕捉初始化***
  21.     TMR1CS=0;              //TMR1时钟源选择内部指令周期时钟(Fosc/4)
  22.     T1CKPS1=0;
  23.     T1CKPS0=1;
  24.     TMR1H=0;
  25.     TMR1L=0;
  26.     TMR1ON=0;              //TMR1计数关闭
  27.     TMR1IE=0;              //关闭T1溢出中断
  28.     TMR1IF=0;
  29.     CCP1IE=1;              //使能CCP1捕获中断
  30.     CCP1CON=0x05;          //捕获上升沿
  31.     CCP1IF=0;              
  32.     PEIE =1;               //外围中断使能

  33. //***CCP2的PWM功能初始化***
  34.     PR2=0x7C;           //装载PR2寄存器设置PWM周期,频率为8kHz
  35.     CCP2CON=0x3C;          //CCP2模块工作在PWM模式
  36.     CCPR2L=0x00;           //装载CCPR2L寄存器设置PWM占空比,为0%
  37.     TMR2IF=0;              //清零PIR1寄存器中的TMR2IF中断标志位
  38.     T2CKPS0=0;            //定时器TMR2设置1:1预分频比,T2CKPS0=0
  39.     T2CKPS1=1;            //定时器TMR2设置1:1预分频比,T2CKPS1=0
  40.     TMR2ON=1;              //T2CON寄存器中的TMR2ON位置1使能Timer2
  41.     TRISC1=0;              //清零TRISC1位,使能CCP2引脚输出驱动器     
  42.     //***************************
  43.     GIE=1;                 //开全局中断
  44. }

  45. //************主函数**********

  46. void main()        
  47. {
  48.   init();
  49.   OE =0;
  50.   time_num = 5;
  51.   time_numold=time_num;
  52.   set_speednum=1000;
  53.   display_flag=1;
  54.   speed_setmid=500;
  55.   set_speed = 500;
  56.   PWM_process(0);
  57.   OE =1;
  58.   page1();
  59.   while(1)
  60.   {
  61.       if(flag>=20)                //一毫秒扫描一次键盘
  62.       {
  63.          flag=0;
  64.          Read_key();
  65.          if(DoorHall==0)
  66.         {
  67.              Doorflag=0;       //安全门关闭
  68.         }
  69.        if(DoorHall==1)
  70.         {
  71.             Doorflag=1;        //安全门打开
  72.         }
  73.       }
  74.        if(flag2==1)             //500ms更新一次显示
  75.       {
  76.          flag2=0;
  77.          display();
  78.       }
  79.      
  80.       
  81.       if(start==1)
  82.        {
  83.            if(PID_flag2>=60)
  84.          {
  85.            filter();
  86.            if(c_over==1)
  87.             {   
  88.                if(Doorflag==0)
  89.                {         
  90.                   Speed_PID();
  91.                 }
  92.               else
  93.              {
  94.               speed_i_v=0;
  95.               speed_different=0;
  96.               speed_out=0;
  97.               //speed_ct=10;
  98.               speedm =0;
  99.               //speed_ct_old=10;
  100.               speed_setmid=speednum;
  101.               //set_speed = 500;
  102.               PWM_process(0);
  103.               PWM_process(0);
  104.              }
  105.              c_over=0;
  106.            }
  107.            PID_flag2=0;  
  108.          }  
  109.       }
  110.   }                                      
  111. }
复制代码 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
dingzy_2002
1楼-- · 2019-03-25 19:58
请问,是怎么影响PWM输出了?是输出波形断开了一段时间还是频率变化?
木瓜舟舟
2楼-- · 2019-03-25 21:10
dingzy_2002 发表于 2017-7-21 08:18
请问,是怎么影响PWM输出了?是输出波形断开了一段时间还是频率变化?

按键按一下,速度冲一下,长按着,速度能冲到顶
dingzy_2002
3楼-- · 2019-03-25 23:34
木瓜舟舟 发表于 2017-7-21 09:32
按键按一下,速度冲一下,长按着,速度能冲到顶

速度冲一下?
是不是PWM输出波形变成高电平一段时间?
如果是这样,看了你的程序段,可能有以下原因:
1.看门狗问题:你程序设置的预分频器是给T0的,这样看问狗复位时间是18MS左右,但主程序部分未见复位看门狗语句.
dingzy_2002
4楼-- · 2019-03-25 23:52
 精彩回答 2  元偷偷看……
木瓜舟舟
5楼-- · 2019-03-26 04:19
dingzy_2002 发表于 2017-7-21 10:07
2.PWM函数问题,主要是按键过程中,PWM数据传递出现异常了.
3.干扰问题:相关函数操作出现互相影响.

您好,我重新一段一段的调试,发现按键影响到了我的速度反馈值,我是用捕获模块来测速的,但就是不明白为什么会影响到它
//*****************测速程序***********************//
void calculate()
{
  if(speednum1<799)
    {
             cp_flag=0;
              if(z==1)
             {
              timelen1=w2-w1;
              speednum1=60000/timelen1;
              if(speednum1>800)
              {
                  speednum1=800;
               }
            
              CCP1IE=1;
              z=0;
              
             }
       }
       else if(speednum1>=800)
          {
               cp_flag=1;
             if(f==1)           //每圈计算一次转速
             {
               if(!(time2>=time1&&TMR1IF))
                {
                   if(time_flag1==1)
                  {
                     time_flag1=0;
                     timelen=time2-time1;
                     speednum1=60000*500/timelen;
                     
                    
                  }  
                if(time_flag2==1)      
                  {
                    time_flag2=0;
                    timelen=60000+5536-time1+time2;
                    speednum1=60000*500/timelen;
                     
                  
                   }
              }
              TMR1IF=0;
             f=0;
              CCP1IE=1;
            
            }
      }
    //return (speednum1);
}
dingzy_2002
6楼-- · 2019-03-26 09:27
木瓜舟舟 发表于 2017-7-22 01:33
您好,我重新一段一段的调试,发现按键影响到了我的速度反馈值,我是用捕获模块来测速的,但就是不明白为 ...

在我看来,可能是实时性问题
即,捕获中断所获得的值是否能得到及时收集与处理?
1.单片机的运行速度要提高;(提高工作频率?)
2.捕获中断的优先级提高,以便获得数据的及时处理.
3.优化程序结构,提高重要函数(如PID等)的运行速度与效率.

一周热门 更多>