找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2737|回复: 0
收起左侧

PWM控制舵机避障小车的C语言程序框架与单片机编程指导下载

[复制链接]
ID:346891 发表于 2018-6-8 09:30 | 显示全部楼层 |阅读模式
  • PCA相关寄存器内存单元分配;
知识点:
//PCA 寄存器内存单元分配
sfr   CCON    = 0xD8;  //PCA 控制寄存器
sbit  CCF0    = CCON^0;//PCA 模块0中断标志
sbit  CR      = CCON^6;//PCA 计数器计数允许位
sbit  CF      = CCON^7;//PCA 计数器溢出标志
sfr   CMOD    = 0xD9;  //PCA 工作模式寄存器
sfr   CL      = 0xE9;  //PCA 计数器低位
sfr   CH      = 0xF9;  //PCA 计数器高位
sfr   CCAPM0  = 0xDA;  //PCA 模块0比较/捕获寄存器
sfr   CCAP0L  = 0xEA;  //PCA 模块0比较/捕获寄存器低位字节
sfr   CCAP0H  = 0xFA;  //PCA 模块0比较/捕获寄存器高位字节
sfr   PCAPWM0 = 0xf2;  //PCA PWM0寄存器
sfr   AUXR    = 0x8E;  //PCA 辅助寄存器
  • PCA寄存器初始化设置;
PCA模块0输出PWM要用作PWM,因不需要进中断处理,程序更为简单,关键是设置模式CCAPM0=0x42即可。
void Init_PWM()//初始化PWM模块,注意此时只到pwm0即P1.3
{
              CCON=0;//PCA停止计数,清零溢出标志和所有中断标志
                CL=0;//PCA计数器低位清零
                CH=0;//PCA计数器清高位清零
                CMOD=0x04;//0x04:定时器时钟
                CCAP0H=CCAP0L=236; //*PWM0 占空比控制舵机居中
              CCAPM0=0x42;//0X42:8位PWM P1.3输出,无中断;
              CR=1; //PCA 计数器开始工作
}
  • 定时器0方式2作为PWM时钟源; 定时器1方式1作为红外传感器时钟
工作方式1 的编程要点:
1、THx/TLx赋初值:THx赋高8位,TLx赋低8位,
2、TMOD选方式: 写“M1,M0”=01 选方式1,
3、若不用门控位,直接用软件写TRx控制启/停,若使用门控位,先置位TRx,然后由INTx端的高/低电平来控制其启/停 。
4、若要允许中断,还须先置位ETx、EA等中断允许控制位,并编写中断服务程序, 若不用中断,可查询“计数溢出标志TFx”的方式工作,但溢出标志TFx须软件清0。
编程要点:TH0=TL0=184;//PWM 50Hz 20ms 11.0592M 184
工作方式2 的编程要点
1、THx/TLx赋相同初值
2、在TLx计数达到0FFH 再加“1”时,TL0将溢出,进位位直接进入“TFx”去申请中断,同时打开三态门,使THx中的值自动重装(Copy)进TLx
3、TMOD寄存器选方式: 写“M1,M0” = 10选中方式2
4、其他用法与各种方式1完全相同
  • PWM控制舵机各占空比设置;
CCAPnH=256(1-占空比)
占空比=高电平时间/周期
   0.5ms         -90°
1ms           -45°
    1.5ms          0°
    2ms            45°
    2.5ms          90°
例如:舵机需输出角度为0°,高电平时间1.5ms,
则CCAPnH=CCAPnL=256 ×(1-1.5/20)=236.8 ,
取236或者237
常用占空比设计
舵机居中:236
    左45°:241
    左27°:238
    右45°:229
右27°:234
编程要点:CCAP0H=CCAP0L=相应占空比。
  • 避障程序设计;
自行选择传感器个数,完成程序设计。


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <math.h>
  3. (对所用到的传感器逐个位定义 方便程序中使用 例如sbit left=P1^0;)
  4. //PCA 寄存器内存单元分配
  5. sfr  CCON    = 0xD8;  //PCA 控制寄存器
  6. sbit CCF0    = CCON^0;//PCA 模块0中断标志
  7. sbit CCF1    = CCON^1;//PCA 模块1中断标志
  8. sbit CR      = CCON^6;//PCA 计数器计数允许位
  9. sbit CF      = CCON^7;//PCA 计数器溢出标志
  10. sfr  CMOD    = 0xD9;  //PCA 工作模式寄存器
  11. sfr  CL      = 0xE9;  //PCA 计数器低位
  12. sfr  CH      = 0xF9;  //PCA 计数器高位
  13. sfr  CCAPM0  = 0xDA;  //PCA 模块0比较/捕获寄存器
  14. sfr  CCAP0L  = 0xEA;  //PCA 模块0比较/捕获寄存器低位字节
  15. sfr  CCAP0H  = 0xFA;  //PCA 模块0比较/捕获寄存器高位字节
  16. sfr  PCAPWM0 = 0xf2;  //PCA PWM0寄存器
  17. sfr  AUXR    = 0x8E;  //PCA 辅助寄存器

  18. //*****************************************************************************/
  19. //PWM初始化设置
  20. void Init_PWM()//初始化PWM模块,         
  21. {
  22.          CCON=0;//PCA停止计数,清零溢出标志和所有中断标志
  23.       CL=0;//PCA计数器低位清零
  24.       CH=0;//PCA计数器清高位清零
  25.       CMOD=0x04;//时钟源 0X00:系统时钟/12,0X02:系统时钟/2,0x04:定时器时钟 0x08:系统时钟
  26.       CCAP0H=CCAP0L=236; //*PWM0 占空比控制 0时占空比 100% 255占空比为0
  27.        CCAPM0=0x42;//0X42:8位PWM P1.3输出,无中断;
  28.      CR=1; //PCA 计数器开始工作
  29. }
  30. //定时器0初始化设置
  31. void Init_Timer0()
  32. {
  33.          AUXR= 0x00;//定时器工作在12T模式
  34.       TMOD = 0x12;//设置定时器0为8位自动重装模式
  35.       TH0=TL0=184;//PWM 50Hz 20ms 11.0592M 18412M178 20M 126
  36.        EA = 1;   
  37.        TR0 = 1;//打开定时器作为PWM时钟
  38.        ET0 = 1;
  39. }
  40. //定时器1初始化设置
  41. void Init_Timer1()
  42. {
  43.       TMOD=0x12;//定时器1工作方式1 (超声波)      
  44.       TH1=0x00;   
  45.       TL1=0x00;
  46.       EA=1;
  47.       TR1=1;
  48.       ET1=1;
  49.      
  50. }
  51. 这部分可编写相应的避障子程序,例如
  52. Void避障程序名 ()
  53. {
  54.                 避障程序设计
  55. }
  56. void main()
  57. {      
  58.         Init_PWM();
  59.         Init_Timer0();
  60.         Init_Timer1();
  61.     while(1)
  62.   {      
  63.     避障子程序调用
  64.   }   
  65. }

复制代码


完整的Word格式文档51黑下载地址:
无碳小车编程指导.docx (47.07 KB, 下载次数: 16)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表