您尚未登录。

楼主 # 2022-09-03 23:04:32

冬眠的龙龙
会员
注册时间: 2022-08-23
已发帖子: 2
积分: 97

MC3712舵机驱动

简单用论坛大佬游总的延迟函数,写了个驱动舵机的,很简单的内容,大佬们见笑了。
使用方法

servo_set(GPIOA_BASE_ADDR,GPIO_PIN0,0);

GPIOA_BASE_ADDR是设置那一组GPIO
GPIO_PIN0是具体哪个IO
0是角度
B站演示:https://www.bilibili.com/video/BV1SV4y1W75g

下面是库文件
servo.h

#ifndef MC3172_SERVO_H_
#define MC3172_SERVO_H_

#include "./MC3172.h"
#include "./thread_config.h"

#if ROTHD_COLCK_SOURCE_SEL==0
#define SYS_CORE_CLK_MHZ 48   // X3
#endif
#if ROTHD_COLCK_SOURCE_SEL==1
#define SYS_CORE_CLK_MHZ 200  // X5
#endif
#if ROTHD_COLCK_SOURCE_SEL==2
#define SYS_CORE_CLK_MHZ 200  // RC
#endif
#if ROTHD_COLCK_SOURCE_SEL==3
#define SYS_CORE_CLK_MHZ 8  // RC with slow speed
#endif

void servo_delay_us(u32 nus);

u16 servo_map(u8 Angle,u8 MinAngle,u8 MaxAngle,u16 MinTime,u16 MaxTime);

void servo_set(u32 GPIOGroupName,u32 GPIONum,u16 Angle);

#endif /* MC3172_SERVO_H_ */

servo.c

#include "MC3172.h"
#include "servo.h"

void servo_delay_us(u32 nus)
{
    u32 start,stop,ticks;
    start = CORE_CNT;
    ticks = nus * SYS_CORE_CLK_MHZ/4;
    if(0xFFFFFFFF-start>=ticks){
        stop=start+ticks;
        while(CORE_CNT<stop && CORE_CNT>start){}
    }
    else{
        stop=ticks-(0xFFFFFFFF-start);
        while(CORE_CNT>start){}
        while(CORE_CNT<stop){}
    }
}

u16 servo_map(u8 Angle,u8 MinAngle,u8 MaxAngle,u16 MinTime,u16 MaxTime)
{
    return (Angle - MinAngle)*(MaxTime-MinTime)/(MaxAngle-MinAngle) + MinTime;
}

void servo_set(u32 GPIOGroupName,u32 GPIONum,u16 Angle)
{
    // 配置IO组
//    INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
    INTDEV_SET_CLK_RST(GPIOGroupName,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

    // 设置具体IO
    GPIO_SET_OUTPUT_EN_VALUE(GPIOGroupName,(GPIONum),GPIO_SET_ENABLE);

    // 50Hz 每个周期20ms
    u8 i = 50;

    while(i--)
    {
        // 设置IO 高电平
        GPIO_SET_OUTPUT_PIN_TO_1(GPIOGroupName,(GPIONum));

        u32 NeedDelayUS = servo_map(Angle, 0, 180, 500, 2500);

        // 延迟
        servo_delay_us(NeedDelayUS);

        // 设置IO 低电平
        GPIO_SET_OUTPUT_PIN_TO_0(GPIOGroupName,(GPIONum));

        // 延迟
        servo_delay_us(20*1000 - NeedDelayUS);
    }
}

最近编辑记录 冬眠的龙龙 (2022-09-03 23:06:18)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn