打印
[PIC®/AVR®/dsPIC®产品]

PIC18F16Q41单片机控制舵机

[复制链接]
1484|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,程序如下
#include "mcc_generated_files/mcc.h"
uint16_t i=500;
void led(void)
{
    PWM1_16BIT_SetSlice1Output1DutyCycleRegister(i);
    PWM1_16BIT_LoadBufferRegisters();
    LED_Toggle();
    i=i+200;
    if(i>2500) i=500;
}
void main(void)
{
    // Initialize the device
    SYSTEM_Initialize();


    // Enable the Global Interrupts
   INTERRUPT_GlobalInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();
    INT0_SetInterruptHandler(led);
   
   
   
    while (1)
    {
        // Add your application code
    }
}
考虑到测试方便,我们使用的是RA5端口,这样在开发板上就可以实现直接插上进行实验了。
006_servo.rar (430.04 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1971

主题

15979

帖子

210

粉丝