做爰全过程网站免费的视频教程,更改网站建设报价,零基础学seo难吗,表单制作小程序所需元件 STM32F103开发板、L298N一个、带编码器的直流电机一个#xff08;如下图所示#xff0c;淘宝上有很多#xff09;
系统框图 通过系统框图#xff0c;我们需要做两件事#xff0c;一是要测速#xff0c;二是要调节。测速目前流行的就是通过编码器测速#xff…所需元件 STM32F103开发板、L298N一个、带编码器的直流电机一个如下图所示淘宝上有很多
系统框图 通过系统框图我们需要做两件事一是要测速二是要调节。测速目前流行的就是通过编码器测速调节器我采用的时PI调节PI调节器调节的参数少而且能够消除静差当然用PID调节器也行。
编码器 编码器的结构简化如下图 在电机转轴上安装了一个磁环在磁环的下方有一个霍尔传感器在磁环转动过程中就在霍尔传感器的附近产生了变化的磁场于是霍尔传感器就输出了脉冲信号。我所用的这个直流电机是148的减速电机电机转轴每转动1圈编码器输出13个脉冲信号也就是说输出转轴转动1圈编码器输出13x48624个脉冲再通过STM32编码器接口 4 倍频就是 624x42496 个脉冲信号通过STM32定时器的计数值除以2496就是输出转轴转动的圈数。 所谓4倍频如下图 编码器中有两个线路即A相和B相。我们以A相或B相为例1个上升沿或者下降沿代表1个脉冲信号由图中可知有2个上升沿或2个下降沿即2个脉冲信号。而所谓的4倍频就是把A、B相的上升沿和下降沿都加起来一共8个与之前的2个脉冲信号就是4倍而所以要加起来做成4倍频可以提高测量转速的精度。另外A、B相之间相差90度从而可以判断电机的转向。如果电机正转A相比B相先90度也就是说A相已经上升沿了B还是低电平。
理论分析
建模 直流有刷电机可以等效为下图结构。 经拉式变换得传递函数 由于电枢电感和转子转动惯量都较小故而传递函数中二次项系数非常小可忽略二次项做降阶处理得
PI调节器 关于PID算法可参考STM32——PID恒温控制 PIPIPI调节器表达式如下 PIPIPI算法省去了微分控制以损失响应快速性为代价以保证系统的可靠性。
理论计算 直流电机的相关参数可以测量出来但由于没有工具只得通过系统辨识的方法获取电机的传递函数 已知电源电压为12v12v12v单片机PWM配置中计数值为100时代表100%占空比周期为10ms可近似pwm的传递函数为 输入为占空比DDD输出为电压且0D1000D1000D100因为计数值为100时代表100%100 \%100%占空比所以可认为占空比就在0D1000D1000D100之间但实际上真正的占空比数值在0−10-10−1之间。令G(s)GG(s)GG(s)Gm(s)∗G(s)*G(s)∗Gpwm(s)(s)(s),得 可近似为一阶系统 此时系统框图如下
得系统闭环传递函数 我希望电机响应的超调量很低调节时间可以长一点相关参数如下 得 计算出来的参数还不能直接使用由于单片机控制电机是离散控制所以实际使用的积分系数KKKi等于计算出的KKKi乘以采样周期TTT。由于传递函数误差或者其他一些原因会造成理论计算的参数并不一定与实际效果高度一致还需手动微调一下找到一个更为合适的参数。 仿真结果如下 通过仿真来看超调量仍然较大调节时间在0.7s0.7s0.7s左右超调量大是由于引入了一个闭环零点调节时间与理论值有误差是由于理论计算是取近似值等原因造成的。如果要追求更低的超调量可以在输入端加入一个前置滤波器该前置滤波器的作用就是用滤波器的极点对消闭环系统的零点系统框图如下 仿真结果如下 从图像上看调节时间变化不大但是超调量明显的小了许多。 这里贴两张速度曲线图 1、 2、 这两组响应的曲线的参数是试凑得来的与理论计算的参数相差不是很大理论计算的参数使用效果上略好一些。图1中设定目标值为400从图上可以看出超调量还是比较小的调节时间也比较短调节的效果还是可以的。图2中目标值每隔一段时间增加100加到400后又设为100整体的调节效果还是蛮不错的。
主要程序
TIM_Encoder.c
#include TIM_Encoder.hfloat RPM_10; //存储上一次测速结果void TIM_Encoder_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟GPIO_InitStructure.GPIO_Pin GPIO_Pin_6|GPIO_Pin_7; //端口配置GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOB, GPIO_InitStructure); //根据设定参数初始化GPIOBTIM_TimeBaseStructInit(TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler 0x0; // 预分频器 TIM_TimeBaseStructure.TIM_Period 65535; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; //选择时钟分频不分频TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; //TIM向上计数 TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3TIM_ICStructInit(TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter 10;TIM_ICInit(TIM4, TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);TIM_Cmd(TIM4, ENABLE);
}int GetTIMCounter(void) //获取计数值
{int countTIM_GetCounter(TIM4);return count;
}float GetRPM(int count) //计算转速
{
// int RPMcount/2496*20000.5;//30ms计算一次pid.T3060000ms为1min,也就是1min计算了2000次249613*4*48表示转动一圈的脉冲数48表示148的减速比float RPMcount*0.8f; //等同于上式2000/2496约等于0.8if(RPM1000) //过滤掉不合理的结果仍然使用上次的速度在按键设定速度的时候或者在减速为0时会有非常的大的错误测速结果具体原因还未查清 {{return RPM_1;}RPM_1RPM; //更新return RPM;
}PID.c
#include PID.hPID pid;
//int time0;void PID_Init()
{ pid.Sv400; //用户设定转速400pid.Kp0.3; //比例pid.Ki0.015; //积分pid.Kd0; //微分pid.pwmcycle100; pid.T30; //PID计算周期30mspid.OUT00;pid.C1ms0;pid.SEk0;pid.Ek0;pid.Ek_10;pid.DelEk0;pid.Dout0;pid.Iout0;pid.Pout0;
}void PID_Calc(float data) //pid计算
{float out;pid.Pvdata;pid.Ekpid.Sv-pid.Pv; //得到当前的偏差值pid.Poutpid.Kp*pid.Ek; //比例输出pid.SEkpid.Ek; //历史偏差总和if(pid.SEk(-50)){pid.SEk(-50);}pid.DelEkpid.Ek-pid.Ek_1; //最近两次偏差之差pid.Ioutpid.Ki*pid.SEk; //积分输出if(pid.Iout(-10)){pid.Iout(-10);}pid.Doutpid.Kd*pid.DelEk; //微分输出out pid.Pout pid.Iout pid.Dout;if(outpid.pwmcycle){pid.OUTpid.pwmcycle;}else if(out0){pid.OUTpid.OUT0; }else {pid.OUTout0.5f; //四舍五入}pid.Ek_1pid.Ek; //更新偏差pid.C1ms0;
}
工程链接 链接https://pan.baidu.com/s/1dSXgPf0gzSvTdjlMHyOZ7w 提取码f8h1 PID调参比较麻烦这里推荐一个ST官方的软件StmStdio,这个软件网上有很多教程使用也比较简单。 链接https://pan.baidu.com/s/1etsrBL80rCe_LouNEE1XEg 提取码ckve