标题:
STM32智能小车编码器源码
[打印本页]
作者:
Ivy_Lee
时间:
2018-6-11 19:12
标题:
STM32智能小车编码器源码
小车电池被拆了没法调试,有错请指正!
待修好再上传更完善的,求大佬点评指正!
单片机源程序如下:
#include "contral.h"
#include "stm32f10x.h"
#include "motor.h"
int Target_velocity=50; //设定速度控制的目标速度为50个脉冲每10ms
/**************************************************************************
函数功能:TIM3中断
入口参数:无
返回 值:无
**************************************************************************/
void TIM3_IRQHandler(void)
{
static int time=0;
time ++;
if(time==10)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
Encoder=transfer(encoder);
Led_Flash(100); //LED闪烁;指示单片机正常运行
Moto=Incremental_PI(Encoder,Target_velocity); //===速度PI控制器
Xianfu_Pwm(); //===PWM限幅
Set_Pwm(Moto);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
time=0;
}
}
/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回 值:电机PWM
根据增量式离散PID公式
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差 以此类推
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target) //Target是目标值
{
float Kp=20,Ki=30;
static int Bias,Pwm,Last_bias;
Bias=Encoder-Target; //计算偏差
Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量输出
}
/**************************************************************************
函数功能:限制PWM赋值
入口参数:无
返回 值:无
**************************************************************************/
void Xianfu_Pwm(void)
{
int Amplitude=7100; /*PWM满幅是7200 限制在7100*/
if(Moto<-Amplitude) Moto=-Amplitude;
if(Moto>Amplitude) Moto=Amplitude;
}
/**************************************************************************
函数功能:绝对值函数
入口参数:int
返回 值:unsigned int
**************************************************************************/
int myabs(int a)
{
int temp;
if(a<0) temp=-a;
else temp=a;
return temp;
}
/**************************************************************************
函数功能:赋值给PWM寄存器
入口参数:PWM
返回 值:无
**************************************************************************/
void Set_Pwm(int moto)
{
if(moto>0) AIN2=1, AIN1=0;
else AIN2=0, AIN1=1;
PWM1=myabs(moto);
}
复制代码
所有资料51hei提供下载:
小车.rar
(406.8 KB, 下载次数: 54)
2018-6-12 02:47 上传
点击文件名下载附件
编码器的1部分
下载积分: 黑币 -5
作者:
啊杰啊啊啊
时间:
2018-11-24 22:46
谢谢楼主分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1