汇集网友智慧,解决技术难题
赞0
评论
2023-07-02
Chenxinyes 发表于 2023-6-28 19:36 sg90
40827649ce8c100084.png (162.48 KB )
下载附件
2023-6-29 10:13 上传
2023-06-29
Chenxinyes 发表于 2023-6-28 19:38 #include "zf_common_headfile.h" #include "zf_driver_pwm.h" #define SERVO_MOTOR_PWM (TI ...
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) { // 此处编写需要循环执行的代码 } }
Chenxinyes 发表于 2023-6-28 21:03 大佬,求解,怎么整
2023-06-28
coody 发表于 2023-6-28 21:01 估计是PPM控制信号的,就发一个周期5~20ms,高电平1.000~2.000ms的脉冲而已,随便整! ...
LcwSwust 发表于 2023-6-28 16:47 我想看看你的往复转动程序
xch 发表于 2023-6-28 17:58 "舵机" 是啥类型?
点击图片添加到编辑器内容中
点击文件名将附件添加到文章中
提交
tyw
315个答案
天意无罪
284个答案
xch
206个答案
jjjyufan
197个答案
coody
187个答案
LcwSwust
143个答案
chunyang
135个答案
tpgf
110个答案
赞0
评论
2023-07-02
赞0
40827649ce8c100084.png (162.48 KB )
下载附件
2023-6-29 10:13 上传
评论
2023-06-29
赞0
servo_motor_duty就是对应转动角度,让它不变即可。
评论
2023-06-29
赞0
评论
2023-06-29
赞0
就是用PWM产生周期为5~20ms,高电平为1.000~2.000ms的高电平啊!
评论
2023-06-28
赞0
大佬,求解,怎么整
评论
2023-06-28
赞0
评论
2023-06-28
赞0
#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); // 延时
// 此处编写需要循环执行的代码
}
}
评论
2023-06-28
怎么用软件模拟PWM功能?为啥不用TIMER?
赞0
sg90
评论
2023-06-28
您需要登录后才可以回复 登录 | 注册