OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2121|回复: 4

mini开发板使用pid算法控制舵机转动

[复制链接]

4

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-11-7
在线时间
11 小时
发表于 2019-12-10 09:40:41 | 显示全部楼层 |阅读模式
1金钱
我用的是mini开发板使用PID算法控制舵机转动的,但是舵机转动过程中感觉转动的不对,自己看不出来哪里出错了,可以帮忙给指点吗,我用的是sg90舵机。#include "control.h"
#include "led.h"
#include "pwm.h"
#include "lcd.h"
#include "key.h"
#include "usart.h"          


PID_TYPE X_PID;
PID_TYPE Y_PID;
UINT8_XY Coordinate = {80,60};//摄像头捕获坐标值40,34

float PidAlgorithm(PID_TYPE *SETPID,float SetValue ,float SensorValue);
void Motordrive(u16 *pwmx,u16 *pwmy);


//注意:C语言中,全局变量和局部静态变量是存储在静态存储区的,他们在分配的时候都被系统默认初始化为0;
//而局部自动变量是在栈上分配内存的,如果不对它们进行初始化,那么他们可能是任意的随机值。
/******************************************************************
*函数名称:        SetParameter
*函数功能:        修改pid参数
*函数参数:       
*返 回 值:       
*******************************************************************/
void SetParameter(PID_TYPE *SETPID,float p,float i,float d)
{
        SETPID->P = p;
        SETPID->I = i;
        SETPID->D = d;
}

/******************************************************************
*函数名称:        TIM4_IRQHandler
*函数功能:        定时器4用于5ms中断
*函数参数:        无
*返 回 值:        无
*******************************************************************/
void TIM4_IRQHandler(void)   //TIM3中断
{
                static u16 time = 0;                        //呼吸灯计数变量
          static u16 OutputX,OutputY;
                const u8 Benchmark_X = 80,Benchmark_Y = 60;//基准值 40,34
       
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
                {       
                        time++;
                        if(time > 7){LED0 = !LED0;LED1 = !LED1;time = 0;}
                       
                        SetParameter(&X_PID,0.35,0.0025,0.1);
                        SetParameter(&Y_PID,0.35,0.0025,0.1);
                       
                        //SetParameter(&X_PID,0.05,0.0025,0.01);
                        //etParameter(&Y_PID,0.05,0.0025,0.01);

                        OutputX = MEDIAN_X + PidAlgorithm(&X_PID,Benchmark_X,Coordinate.X);
                        OutputY = MEDIAN_Y + PidAlgorithm(&Y_PID,Benchmark_Y,Coordinate.Y);
                       
                       
                        Motordrive(&OutputX,&OutputY);
                       
                        TIM_ClearITPendingBit(TIM4, TIM_IT_Update );  //清除TIMx的中断待处理位:TIM 中断源
                }
}

/******************************************************************
*函数名称: PidAlgorithm
*函数功能: pid算法
*函数参数:
*返 回 值:
*******************************************************************/
float PidAlgorithm(PID_TYPE *SETPID,float SetValue ,float SensorValue){
               
                SETPID->Error = SetValue - SensorValue;
          SETPID->Integral += SETPID->Error;
          SETPID->Differ = SETPID->Error - SETPID->LastError;
       
//                if(SETPID->Integral > 2300) SETPID->Integral = 2300;
//    if(SETPID->Integral < -2300) SETPID->Integral = -2300;
       
          SETPID->OutPut = (  SETPID->P * SETPID->Error
                                                                                        + SETPID->I * SETPID->Integral
                                                                                        + SETPID->D * SETPID->Differ    );
       
                SETPID->LastError = SETPID->Error;
       
          return SETPID->OutPut;
}

/******************************************************************
*函数名称:     Motordrive
*函数功能:     驱动电机
*函数参数:                         X/Y轴方向PID闭环反馈输出
*******************************************************************/
void Motordrive(u16 *pwmx,u16 *pwmy)
{
                if(*pwmx > 100) *pwmx = 100;
          if(*pwmx < 40) *pwmx = 40;
                if(*pwmy > 100) *pwmy = 100;  
          if(*pwmy < 50) *pwmy = 50;
//                        printf("\n\r\n\rOUT_X : %d\n\r",*pwmx);
//                        printf("\n\rOUT_Y : %d\n\r",*pwmy);

                SERVO_X = *pwmx;
          SERVO_Y = *pwmy;
}












































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-10 12:43:40 | 显示全部楼层
帮顶                                       
成功没有捷径
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2019-12-10 16:30:46 | 显示全部楼层
顶一顶
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-11-7
在线时间
11 小时
 楼主| 发表于 2019-12-11 16:25:32 | 显示全部楼层
请问SG90舵机的
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = prc;
arr,prc一般设置多少,20ms周期
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6456
金钱
6456
注册时间
2018-6-27
在线时间
546 小时
发表于 2019-12-20 19:59:04 | 显示全部楼层
帮忙顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 08:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表