【单舵机PID】开源!基于STM32 使用PID算法控制舵机 有对比视频

序言

文章说明:

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

  • 12
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星汇电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值