[PIC®/AVR®/dsPIC®产品] PIC18F16Q41单片机控制舵机

[复制链接]
1894|1
 楼主| gaoyang9992006 发表于 2021-10-24 23:32 | 显示全部楼层 |阅读模式
舵机型号
型号:MG90S   重量16克 角度90度-180度通用
实物如下图



接线顺序与控制方法
信号线(黄线)红线(电源线)棕色(地线)

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;
   2.5ms-----------180度;
因此是使用50Hz的PWM,这样一个周期是20ms




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| gaoyang9992006 发表于 2021-10-24 23:43 | 显示全部楼层
在时钟的配置上,我们设置系统时钟为1Mhz,PWM采用系统时钟作为时钟源,不分频
这样将PWM设置为50Mhz,就是每个PWM周期对应系统时钟的20K次周期,
20K------------------20ms
2.5k-----------------2.5ms----------180°
0.5k-----------------0.5ms----------0°
因此我们按以上对应就是高电平寄存器设置的参数就是500到2500,就对应上了0度和180度。
为了实验方便,我们设置按键中断函数内进行修改这个参数。用LED翻转展示是否实现按键中断。
从500到2500,一共2000个整数可以设置,为了更加明显,我们设置成10级,也就是每次调整200,程序如下
  1. #include "mcc_generated_files/mcc.h"
  2. uint16_t i=500;
  3. void led(void)
  4. {
  5.     PWM1_16BIT_SetSlice1Output1DutyCycleRegister(i);
  6.     PWM1_16BIT_LoadBufferRegisters();
  7.     LED_Toggle();
  8.     i=i+200;
  9.     if(i>2500) i=500;
  10. }
  11. void main(void)
  12. {
  13.     // Initialize the device
  14.     SYSTEM_Initialize();


  15.     // Enable the Global Interrupts
  16.    INTERRUPT_GlobalInterruptEnable();

  17.     // Disable the Global Interrupts
  18.     //INTERRUPT_GlobalInterruptDisable();
  19.     INT0_SetInterruptHandler(led);
  20.    
  21.    
  22.    
  23.     while (1)
  24.     {
  25.         // Add your application code
  26.     }
  27. }
考虑到测试方便,我们使用的是RA5端口,这样在开发板上就可以实现直接插上进行实验了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2053

主题

16420

帖子

222

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