问答

汇集网友智慧,解决技术难题

21ic问答首页 - PMW驱动舵机

PMW驱动舵机

Chenxinyes2023-06-28
怎么用mm32 调用库函数 使pmw驱动舵机转动,规定角度,而不是一直循环往复转动
回答 +关注 10
4451人浏览 12人回答问题 分享 举报
12 个回答
  • 已经实现这个功能了谢谢大家


  • 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)
        {                          
            // 此处编写需要循环执行的代码
         }
    }
  • 你下载完程序后,用USB供电了吗?SG90要比较大的电流才能驱动。
  • Chenxinyes 发表于 2023-6-28 21:03
    大佬,求解,怎么整

    就是用PWM产生周期为5~20ms,高电平为1.000~2.000ms的高电平啊!
  • coody 发表于 2023-6-28 21:01
    估计是PPM控制信号的,就发一个周期5~20ms,高电平1.000~2.000ms的脉冲而已,随便整! ...

    大佬,求解,怎么整
  • 估计是PPM控制信号的,就发一个周期5~20ms,高电平1.000~2.000ms的脉冲而已,随便整!
  • 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? 
  • xch 发表于 2023-6-28 17:58
    "舵机"  是啥类型?

    sg90
12下一页

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