微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 舵机怎么控制好?用PCA模块控制怎么调节占空比就是不行

舵机怎么控制好?用PCA模块控制怎么调节占空比就是不行

时间:10-02 整理:3721RD 点击:
红色部分就是调节占空比的嘛。但就是不行,怎么控制都不行,呜呜呜....
#include<STC12C5A60S2.H>
#include "Timer0Init.h"
void main()                                                 //现在是默认的12T,若AUXR = 0x40;之后则是1T
{
        int i;
        Timer0Init();
        CMOD=0x04; // Setup PCA timer         PCA 在空闲模式下停止 PCA 计数器工作
                                //PCA 时钟源为 定时器0 (T0) 的溢出率
                                //禁止 PCA 计数器溢出(CH,CL 由 FFFFH 变为 0000H 时)中断
        CCON=0x00;        //CF = 0,清0 PCA 计数器溢出中断请求标志位
                                //R = 0, 不允许 PCA 计数器计数
                                //清0 PCA 各模块中断请求标志位,如 CCF1,CCF0
                       
        CL=0x00;                //PCA计数器寄存器,当CCAP0L小于CL时,低电平,高于,高电平
        CH=0x00;          
        CCAPM0=0x42; //0100,0010 Setup PCA module 0 in PWM mode
        PCA_PWM0=0x00;
        CR=1; //Start PCA Timer.
        while(1)
        {
                CCAP0H=235;
                for(i=20;i>0;i--);
                CCAP0H=230;                 
                for(i=20;i>0;i--);       
        }
}

这是我的代码,但是只有8位的精度不知道能帮得了你不。

  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. ///*Declare SFR associated with the PCA */
  6. //sfr CCON        =   0xD8;           //PCA control register
  7. //sbit CCF0       =   CCON^0;         //PCA module-0 interrupt flag
  8. //sbit CCF1       =   CCON^1;         //PCA module-1 interrupt flag
  9. //sbit CR         =   CCON^6;         //PCA timer run control bit
  10. //sbit CF         =   CCON^7;         //PCA timer overflow flag
  11. //sfr CMOD        =   0xD9;           //PCA mode register
  12. //sfr CL          =   0xE9;           //PCA base timer LOW
  13. //sfr CH          =   0xF9;           //PCA base timer HIGH
  14. //sfr CCAPM0      =   0xDA;           //PCA module-0 mode register
  15. //sfr CCAP0L      =   0xEA;           //PCA module-0 capture register LOW
  16. //sfr CCAP0H      =   0xFA;           //PCA module-0 capture register HIGH
  17. //sfr CCAPM1      =   0xDB;           //PCA module-1 mode register
  18. //sfr CCAP1L      =   0xEB;           //PCA module-1 capture register LOW
  19. //sfr CCAP1H      =   0xFB;           //PCA module-1 capture register HIGH
  20. //sfr PCAPWM0     =   0xf2;
  21. //sfr PCAPWM1     =   0xf3;

  22. //sfr AUXR        =   0x8e;

  23. ////sbit EPCA_LVD   =   IE^6;
  24. sbit pwm_0 = P0^0;
  25. uint num = 1;
  26. uchar pos = 9;
  27. //void Timer0Init(void)               
  28. //{
  29. //        AUXR &= 0x3F;
  30. //        TMOD &= 0xF0;       
  31. //        TMOD |= 0x02;       
  32. //        TL0 = 0xb2;        //178 f = 50HZ       
  33. //        TH0 = 0xb2;               
  34. //        TF0 = 0;               
  35. //        TR0 = 1;               
  36. //}

  37. //void PCA_init(void)
  38. //{
  39. //    CCON = 0;                       //Initial PCA control register
  40. //                                    //PCA timer stop running
  41. //                                    //Clear CF flag
  42. //                                    //Clear all module interrupt flag
  43. //    CL = 0;                         //Reset PCA base timer
  44. //    CH = 0;
  45. //    CMOD = 0x05;                    //Set PCA timer clock source as Timer0
  46. //                                    //Disable PCA timer overflow interrupt
  47. //    CCAPM0 = 0X42;
  48. //    CCAPM1 = 0X42;
  49. //    CCAP0L = 0XFF;
  50. //    CCAP0H = 0Xfa;
  51. //    CCAP1L = 0XFF;
  52. //    CCAP1H = 0XFF;
  53. //    PCAPWM0 = 0X00;
  54. //    PCAPWM1 = 0X00;
  55. //    CR = 1;
  56. //}

  57. void timer0_init(void)
  58. {
  59.         TMOD = 0x01;   
  60.         TH0 = (65535 - 10) / 256;
  61.         TL0 = (65535 - 10) % 256;
  62.         TR0 = 1;
  63.         EA = 1;
  64.         ET0 = 1;
  65. }

  66. void main()
  67. {   
  68.     uint i, j;
  69.     uchar flag = 1 , pwm_0 = 0;
  70.     timer0_init();
  71.     while(1)
  72.     {
  73.         if (flag == 1)
  74.         {
  75.             pos++;
  76.             if(pos >= 1000)
  77.             {
  78.                 flag = 0;
  79.             }
  80.             for (i = 0; i < 60; i++)
  81.             {
  82.                 for (j = 0; j < 60; j++);
  83.             }
  84.         }
  85.         
  86.         if (flag == 0)
  87.         {
  88.             pos--;
  89.             if (pos<= 9)
  90.             {
  91.                 flag = 1;
  92.             }
  93.             for (i = 0; i < 60; i++)
  94.             {
  95.                 for (j = 0; j < 60; j++);
  96.             }
  97.         }
  98.     }
  99. //    Timer0Init();
  100. //    PCA_init();     //0.46ms~2.5ms  0xfa~0xe0
  101. //    while(1)
  102. //    {   
  103. //        if (flag == 1)
  104. //        {
  105. //            CCAP0H--;
  106. //            if (CCAP0H <= 0xe0)
  107. //            {
  108. //                flag = 0;
  109. //            }
  110. //            for (i = 0; i < 6000; i++)
  111. //            {
  112. //                for (j = 0; j < 60; j++);
  113. //            }
  114. //        }
  115. //        if (flag == 0)
  116. //        {
  117. //            CCAP0H++;
  118. //            if (CCAP0H >= 0xfa)
  119. //            {
  120. //                flag = 1;
  121. //            }
  122. //            for (i = 0; i < 6000; i++)
  123. //            {
  124. //                for (j = 0; j < 60; j++);
  125. //            }
  126. //        }
  127. //    }
  128. }

  129. //void PCA_inter() interrupt 6
  130. //{
  131. //    if (CF == 1)
  132. //        {
  133. //            CF = 0;
  134. //            
  135. //            if (CCAP0H != 0)
  136. //            {
  137. //                CCAP0H--;
  138. //            }
  139. //            else
  140. //            {
  141. //                CCAP0H = 0xff;
  142. //            }
  143. //            
  144. //            if (CCAP1H != 0)
  145. //            {
  146. //                CCAP1H--;
  147. //            }
  148. //            else
  149. //            {
  150. //                CCAP1H = 0xff;
  151. //            }
  152. //        }
  153. //}

  154. void timer0_isr(void) interrupt 1
  155. {
  156.         TH0 = (65535 - 10) / 256;
  157.         TL0 = (65535 - 10) % 256;
  158.         TR0 = 0;
  159.     num++;
  160.     if (num >= 1165)
  161.     {
  162.         num = 0;
  163.     }
  164.     if (num >= pos)   //0.5ms 9         2.5ms 45
  165.     {
  166.         pwm_0 = 0;
  167.     }
  168.     else
  169.     {
  170.         pwm_0 = 1;
  171.     }
  172.     TR0 = 1;
  173. }


复制代码

这个pca被注释掉了,换成了定时器产生。你不管定时器一,剩下的就是PCA使用定时器0产生周期50HZ的PWM。使用晶振12M

你直接看while(1)里面被注释掉的就对了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top