基于STM32F407的座椅展示
先看看成品样子、本次电路图,有图有真相
有朋友介绍说有个座椅展示舱,原来设备可以正常运行,但年久失修,部分器件损坏,导致不能运行,因此需要在保留原来主体结构的基础上,重新设计电器控制部分,实现原来运动。
现场勘验,设备主体分4个部分:
单椅部分
X轴,直流运行电机,有前、后限位光电开关,中间有2个接近开关,中间有一个感应开关;
Y轴,直流运行电机,有前后限位光电开关(限位位置需要和X位置配合);
旋转,无刷直流电机,带控制器,有前、中、后限位光电开关;
单椅头枕调节,直流电杠,1个线限位开关。
靠背翻转,2个电机,有前、中、后光电限位;
托腿,2个电机,有1个后限位开关。
双椅部分:
X轴:直流电机,有前、后限位开关;
旋转靠背,2个直流电机,有前、后限位开关;
头枕上下,2个直流电机,每个有1给下限位开关;
头枕旋转,2个直流电机,每个有前、后限位开关;
臀部顶升,1个电缸,下限位开关
腰部顶升,1个电缸,下限为开关
小凳子部分
X轴:步进电机,有驱动器,有前、后限位,中间有两个接近开关。
升降:1个电缸,下限位开关。
小桌子部分
X轴:成品门控系统,有前、后限位光电;
Y轴,1个直流电机,有前、后限位开关;
旋转,1个直流电机,有前、后限位开关。
根据现场设备调研和实际开发周期要求(要求15天开发完成),丙方确定找现成的板子做。选板如下,主角出场
该板主控芯片STM32F407,有24个光隔输入、16个光个输出,20路差分输出、1路485、1路232。原计划有4块,1块做主控,3块从,每块控制一部分;主控接收上位指令,根据定义自己处理或分发给对应的板子处理。随着测验的进一步进行,整体方案变更为使用两块板子,功能框图如下
驱动板开始选用
因为有些电机太大,导致在堵转情况下烧板子;老板说:这种情况宁可让烧电机都不能让烧板子,责任不一样呀。好了,新的强力驱动上场了:
到此,硬件的基本介绍完了。
程序设计
1:系统节拍
用TIM3做一个1ms的系统节拍,作为输入、延迟等的实际基础。
因为TIM3在APB1总线上,我们定义的APB1总线频率为84Mhz
因此配置TIM3参数如下
htim3.Init.Prescaler = 83;
htim3.Init.Period = 1000;
并且启动TIM3的中断:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim3)
{
}
}
2:输入信号采集
因为输入信号有可能有抖动,因此需要做去抖操作。本系统中所有去抖时长都为10ms。
#define KEYDELAY 10
void Key_delay(void)
{
int i;
for(i = 0; i < MaxIn; i++)
{ //key_data确认的输入口值
if(key_data[i] != key_indata[i]) //key_indata读到的输入口值
{ //key_tmpdata临时输入值
if(key_tmpdata[i] == key_indata[i])
{
if(key_delay[i] == 0)
{
key_data[i] = key_indata[i];
}
}
else
{
key_delay[i] = KEYDELAY;
key_tmpdata[i] = key_indata[i];
}
}
}
}
该函数在主程序中循环调用。
去抖延迟部分在TIM3定时器中断中加入
for(i = 0; i < MaxIn; i++)
{
if(key_delay[i] > 0)
{
key_delay[i] --;
}
}
3:电机PWM控制
根据实际测试,本设备用定脉宽控制就可满足使用要求。
我们用TIM8作为脉冲控制定时器,配置PWM输出引脚如下
TIM8在APB2总线上,该总线频率168MHz。
htim8.Init.Prescaler = 41;
htim8.Init.Period = 500;
计算PWM频率为8KHz。
在CH4上接的单人椅子X轴,占空比70%时,运行速度满足要求,因此程序配置
sConfigOC.Pulse = 350;
4:步进电机脉冲控制
小凳子X轴的步进电机有专用的步进电机控制器,需要的控制信号有方向、使能、步进速度。
经测试步进电机1秒1圈的速度满足实际要求。步进电机控制器上正好有8K的细分。这样就可以用TIM8的CH1作为步进脉冲速度控制引脚。