序言
文章说明:
1.本人写的文章侧重简单明了,不说废话,不介绍具体原理(估计你们也不想看,我也不想,哈哈),只告诉你们怎么去使用。
2.单片机代码大都是,在网上代码加以修改的(实话),服务器、网页、小程序都是个人开发的。
3.标注开源的都会给出单片机的代码,网页、小程序不开源(个人已经做1年多了,知识付费)。
4.需要源码、教学交流、做功能可以加我q1339675053。
其他项目:
一、项目信息
模块工具:
1.STM32F103C8T6
2.舵机
3.B站视频:舵机PID
【单舵机PID】开源!!基于STM32hal 库使用PID算法控制舵机
二、原理
1.舵机(最大转动180度)
1.舵机怎么转动的?
答:STM32向舵机的信号线发送PWM信号控制舵机的输出量,不同占空比转动不同角度。
2.什么是占空比?
答:一个周期中高电平的占比。
3.怎么设置?
答:将定时器设置20ms周期,调整高电平0.5ms到2.5ms
不同的占空比 = t / T 相关参数如下:
t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°
三、项目内容
1.接线图
2.CUBEMX配置
1.时钟配置
2.配置定时器3
3.引脚
4.配置定时器4 (用不到引脚)
5.开启中断
6.配置串口1 参数默认
3.keil5配置
1.头文件
#include "stdio.h"
#include <stdlib.h>
2.变量、函数定义
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
int flag_vpwm=0;
int flag_pwm=0;
uint16_t Position = 250, Target = 750;int Velocity1;
uint16_t Position_KP=7,Position_KI=0,Position_KD=20; //位置控制PID参数
/********PID******************/
int Position_PID(uint16_t Encoder,uint16_t Target)
{
static uint16_t Bias, Pwm, Integral_bias, Last_Bias;
if(Target > Encoder)
{
Bias = Target - Encoder;
//Integral_bias += Bias;
Pwm = Position_KP*Bias/100 + Position_KI * Integral_bias/100+Position_KD*(Bias-Last_Bias)/100;
Last_Bias = Bias;return Pwm;
}
else
{
Bias = Encoder - Target;
//Integral_bias += Bias;
Pwm = Position_KP*Bias/100 + Position_KI * Integral_bias/50+Position_KD*(Bias-Last_Bias)/100;
Last_Bias = Bias;return -Pwm;
}
}void Set_Pwm1() //舵机1
{
Velocity1 = Position_PID(Position,Target);
if(Velocity1 == 0)
{
Position = Target;
}
Position += Velocity1; //速度的积分,得到舵机的位置
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Position);
}
3.主函数
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_Base_Start_IT(&htim4);
4.while循环
if(flag_vpwm == 1)
{
Set_Pwm1(); //舵机1
printf("pwm:%d\r\n",Position);
flag_vpwm = 0;
}
if(Velocity1==0 && Position == 1250)
{
Target = 250;
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,250); //舵机2
}
if(Velocity1==0 && Position == 250)
{
Target = 1250;
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,1250); //舵机2
}
5.定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim4.Instance) //10ms
{
flag_pwm++;if(flag_pwm == 2) //20ms
{
//
flag_vpwm = 1;
flag_pwm = 0;
}
}}
6.结。
四、代码验证
B站视频:舵机PID
记得去三连~~~
注:有错误或者不理解的地方请在评论指出,我会答复的。
代码资源放在网盘或者我的服务器,不放这里(下载要钱)。
资源链接:htt删p://mqtttwj删.top:删8070/删FileNode