打印

PMW驱动舵机

[复制链接]
4606|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
LcwSwust| | 2023-6-28 16:47 | 只看该作者
我想看看你的往复转动程序

使用特权

评论回复
板凳
xch| | 2023-6-28 17:58 | 只看该作者
"舵机"  是啥类型?

使用特权

评论回复
地板
Chenxinyes|  楼主 | 2023-6-28 19:36 | 只看该作者
sg90

使用特权

评论回复
5
Chenxinyes|  楼主 | 2023-6-28 19:37 | 只看该作者
xch 发表于 2023-6-28 17:58
"舵机"  是啥类型?

sg90

使用特权

评论回复
6
Chenxinyes|  楼主 | 2023-6-28 19:38 | 只看该作者
LcwSwust 发表于 2023-6-28 16:47
我想看看你的往复转动程序

#include "zf_common_headfile.h"
#include "zf_driver_pwm.h"
#define SERVO_MOTOR_PWM             (TIM2_PWM_CH1_A15)                          // 定义主板上舵机对应引脚
#define SERVO_MOTOR_FREQ            (50 )                                       // 定义主板上舵机频率  请务必注意范围 50-300

#define SERVO_MOTOR_L_MAX           (75 )                                       // 定义主板上舵机活动范围 角度
#define SERVO_MOTOR_R_MAX           (105)                                       // 定义主板上舵机活动范围 角度

// ------------------ 舵机占空比计算方式 ------------------
//
// 舵机对应的 0-180 活动角度对应 控制脉冲的 0.5ms-2.5ms 高电平
//
// 那么不同频率下的占空比计算方式就是
// PWM_DUTY_MAX/(1000/freq)*(1+Angle/180) 在 50hz 时就是 PWM_DUTY_MAX/(1000/50)*(1+Angle/180)
//
// 那么 100hz 下 90度的打角 即高电平时间1.5ms 计算套用为
// PWM_DUTY_MAX/(1000/100)*(1+90/180) = PWM_DUTY_MAX/10*1.5
//
// ------------------ 舵机占空比计算方式 ------------------
#define SERVO_MOTOR_DUTY(x)         ((float)PWM_DUTY_MAX / (1000.0 / (float)SERVO_MOTOR_FREQ) * (0.5 + (float)(x) / 90.0))

#if (SERVO_MOTOR_FREQ < 50 || SERVO_MOTOR_FREQ > 300)
    #error "SERVO_MOTOR_FREQ ERROE!"
#endif

float servo_motor_duty = 90.0;                                                  // 舵机动作角度
float servo_motor_dir = 1;                                                      // 舵机动作状态

int main (void)
{
    clock_init(SYSTEM_CLOCK_120M);                                              // 初始化芯片时钟 工作频率为 120MHz
    debug_init();                                                               // 初始化默认 Debug UART
    // 此处编写用户代码 例如外设初始化代码等
    pwm_init(SERVO_MOTOR_PWM, SERVO_MOTOR_FREQ, 0);
    // 此处编写用户代码 例如外设初始化代码等

    while(1)
    {
                          
        // 此处编写需要循环执行的代码
        pwm_set_duty(SERVO_MOTOR_PWM, (uint32)SERVO_MOTOR_DUTY(servo_motor_duty));

        if(servo_motor_dir)
        {
            servo_motor_duty ++;
            if(SERVO_MOTOR_R_MAX <= servo_motor_duty)
            {
                servo_motor_dir = 0x00;
            }
        }
        else
        {
            servo_motor_duty --;
            if(SERVO_MOTOR_L_MAX >= servo_motor_duty)
            {
                servo_motor_dir = 0x01;
            }
        }
        system_delay_ms(100);                                                   // 延时
        // 此处编写需要循环执行的代码
    }
}

使用特权

评论回复
评论
xch 2023-6-29 10:15 回复TA
怎么用软件模拟PWM功能?为啥不用TIMER? 
7
coody| | 2023-6-28 21:01 | 只看该作者
估计是PPM控制信号的,就发一个周期5~20ms,高电平1.000~2.000ms的脉冲而已,随便整!

使用特权

评论回复
8
Chenxinyes|  楼主 | 2023-6-28 21:03 | 只看该作者
coody 发表于 2023-6-28 21:01
估计是PPM控制信号的,就发一个周期5~20ms,高电平1.000~2.000ms的脉冲而已,随便整! ...

大佬,求解,怎么整

使用特权

评论回复
9
coody| | 2023-6-28 21:05 | 只看该作者
Chenxinyes 发表于 2023-6-28 21:03
大佬,求解,怎么整

就是用PWM产生周期为5~20ms,高电平为1.000~2.000ms的高电平啊!

使用特权

评论回复
10
liszt99| | 2023-6-29 08:23 | 只看该作者
你下载完程序后,用USB供电了吗?SG90要比较大的电流才能驱动。

使用特权

评论回复
11
LcwSwust| | 2023-6-29 08:24 | 只看该作者
Chenxinyes 发表于 2023-6-28 19:38
#include "zf_common_headfile.h"
#include "zf_driver_pwm.h"
#define SERVO_MOTOR_PWM             (TI ...

servo_motor_duty就是对应转动角度,让它不变即可。
int main (void)
{
    clock_init(SYSTEM_CLOCK_120M); // 初始化芯片时钟 工作频率为 120MHz
    debug_init(); // 初始化默认 Debug UART
    // 此处编写用户代码 例如外设初始化代码等
    pwm_init(SERVO_MOTOR_PWM, SERVO_MOTOR_FREQ, 0);
    // 此处编写用户代码 例如外设初始化代码等
pwm_set_duty(SERVO_MOTOR_PWM, (uint32)SERVO_MOTOR_DUTY(servo_motor_duty));
    while(1)
    {                          
        // 此处编写需要循环执行的代码
     }
}

使用特权

评论回复
12
xch| | 2023-6-29 10:13 | 只看该作者


使用特权

评论回复
13
Chenxinyes|  楼主 | 2023-7-2 12:18 | 只看该作者
已经实现这个功能了谢谢大家

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝