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
2019-03-26 09:27
木瓜舟舟 发表于 2017-7-22 01:33
您好,我重新一段一段的调试,发现按键影响到了我的速度反馈值,我是用捕获模块来测速的,但就是不明白为 ...

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

一周热门 更多>