基于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作为步进脉冲速度控制引脚。
|