[51单片机] 想利用STC12的PCA16位定时器实现16位PWM输出,结果改变CCAP1值后无输出了。

[复制链接]
 楼主| 江米条 发表于 2015-6-25 17:05 | 显示全部楼层 |阅读模式
想利用STC12的PCA16位定时器实现16位PWM输出.
计划是这样的,把PCA1设成16位定时器模式,当PCA1中断时,将IO脚拉高,当PCA的计时器溢出中断时,将IO脚拉低。这样就实现了PWM。

想着挺好。

试了下,给初始化时,将PCA1设成16位定时器,并且给CCAP1H,CCAP1L赋初值,并设PCA也可计时溢出中断。
这样,测试IO脚有固定占空比的PWM,和预想的一样。

然后想主循环里改百年CCAP1H和CCAP1L的值,来实现占空比可调。结果发现不行,IO口很快变成低电平,并始终保持。
那么我试着将CCAP1H逐渐自加吧。发现可以,占空比逐渐变化。
然后,我再尝试,在主程序里给CCAP1H及CCAP1L赋固定值,结果不行,IO口很快变低并始终保持。

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C56xx Series MCU PCA module as 16-bit Timer Demo -------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/

  7. #include "stc12c5630ad.h"
  8. #include "intrins.h"

  9. #define FOSC    11059200L
  10. #define T100Hz  (FOSC / 12 / 100)

  11. typedef unsigned char BYTE;
  12. typedef unsigned int WORD;


  13. sbit PCA_LED = P1^4;           //PCA test LED
  14. sbit PCA_VEE = P3^7;
  15. sbit PCA_PWM = P3^5;

  16. BYTE cnt;
  17. unsigned value;

  18. void Delay1000ms()                //@11.0592MHz
  19. {
  20.         unsigned char i, j, k;

  21.         _nop_();
  22.         _nop_();
  23.         i = 43;
  24.         j = 6;
  25.         k = 203;
  26.         do
  27.         {
  28.                 do
  29.                 {
  30.                         while (--k);
  31.                 } while (--j);
  32.         } while (--i);
  33. }


  34. void PCA_isr() interrupt 6 using 1
  35. {
  36.     if(CCF0)
  37.         {
  38.                 CCF0 = 0;                       //Clear interrupt flag
  39.                 CCAP0H += 4;                            //Update compare value
  40.                 PCA_VEE = !PCA_VEE;
  41.         }
  42.         if(CCF1)
  43.         {
  44.                 CCF1 = 0;
  45.                 PCA_PWM = 1;
  46.         }
  47.         if(CF)
  48.         {
  49.                 CF = 0;
  50.                 PCA_PWM = 0;
  51.         }
  52. }

  53. void main()
  54. {
  55.         CCON = 0;                       //Initial PCA control register
  56.                                     //PCA timer stop running
  57.                                     //Clear CF flag
  58.                                     //Clear all module interrupt flag
  59.     CL = 0;                         //Reset PCA base timer
  60.     CH = 0;
  61.     CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2
  62.                                     //Enable PCA timer overflow interrupt
  63.     CCAP0L = 0;
  64.     CCAP0H = 0;                                    //Initial PCA module-0
  65.     CCAPM0 = 0x49;                  //PCA module-0 work in 16-bit timer mode and enable PCA interrupt

  66.     CCAP1H = 0x0F;
  67.         CCAP1L = 0xFF;
  68.         CCAPM1 = 0x49;
  69.        
  70.         CR = 1;                         //PCA timer start run
  71.     EPCA_LVD = 1;
  72.     EA = 1;
  73.     cnt = 0;

  74.     while (1)
  75.         {
  76.                 Delay1000ms();
  77.                 CCAP1H = 0x0F;
  78.                 CCAP1L = 0xFF;
  79. //                CCAP1H += 100;
  80.         }
  81. }
 楼主| 江米条 发表于 2015-6-26 09:14 | 显示全部楼层
早晨了,再顶一下吧。
 楼主| 江米条 发表于 2015-6-26 09:27 | 显示全部楼层
找到问题了,CCAP1H,CCAP1L赋值有先后顺序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部