主板主控stm32F429,主要加热和电机控制功能,加热使用定时器14生成PWM,电机使用定时器3,系统使用RTT1.2.2版本的系统。上位机使用的昆仑通态串口屏,总是会不定期死机,最多运行3-4天,少的运行10个小时就会死机。加热功能代码
static void heat_timeout(void* parameter)
{
// rt_kprintf("heat beat!\n");
PWM_Control_Heat();
}
u8 initHeatTimer(u16 ms)
{
heatProcessSeconds=0;
rt_timer_init(&heatbeat, "heat timer",
heat_timeout, /* bind timeout callback function */
RT_NULL,
(1000 * ms) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1,
RT_TIMER_FLAG_PERIODIC);
return TRUE;
}
void PWM_Control_Heat(void)
{
PWM=PID_realize();
TIM_SetCompare1(TIM14,PWM);
}
void heat_test(float temp,u8 flag)
{
setKP(502);//设置Kp
setKI(7.4);//设置比例积分
setKD(19);//设置比例积分
PID_Init();
setSETTEMP1(temp);
if(heatctrl_flag == 0)
{
rt_kprintf("目标TEMP=%f\r\n",temp);
initHeatTimer(1*1000);//初始化加热时间
rt_timer_start(&heatbeat);//定时器开始加热
heatctrl_flag = 1;heatctrl_flag_fff = 0;
}
return ;
}
void heat_run_stop(void)
{
if(heatctrl_flag_fff == 0){
if(rt_timer_stop(&heatbeat) == RT_EOK)
{
TIM_SetCompare1(TIM14,0);
heatctrl_flag = 0;
heatctrl_flag_fff = 1;
}
return ;
}
}
void TIM14_PWM_Init(u32 arr,u32 psc)// TIM14_PWM_Init(10000-1,9000-1);180M
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能TIM14时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能io口时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //设置F9为TIM14的复用
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //led0和led1对应的io口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //高速模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //初始化定时器14
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //pwm调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性低
TIM_OC1Init(TIM14,&TIM_OCInitStructure);
TIM_SetCompare1(TIM14,PWM);
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14,ENABLE);
TIM_Cmd(TIM14,ENABLE);
}
电机参数
void pumpTurn_stop(void)
{
union scy_float_t scy_floattemp;
rt_timer_stop(&motorRaceTime);
drvPulseExecute(DISABLE);//停止
motorctrl_flag = 0;
}
static void motorrace_timeout(void* parameter)//电机走步超时
{
if(flow_t.flag ) rt_event_send(&raceEvent, EVENT_FLAG6);
else rt_event_send(&raceEvent,EVENT_FLAG1);
}
#if 1
u8 initmotorRaceTimer(u16 ms)//电机运动事件
{
rt_timer_init(&motorRaceTime, "motor race timer",
motorrace_timeout, /* bind timeout callback function 绑定超时回调函数*/
RT_NULL,
(1000 * ms) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1,
RT_TIMER_FLAG_ONE_SHOT); /* one shot */
// rt_kprintf("电机走步数race: %d ms\n",ms);
return TRUE;
}
void pumpTurn(struct FLOWPROCESS_T floww_t )//泵转
{
union scy_float_t scy_floattemp;
rt_uint32_t e;
float speed=flow_t.speed;//转速
u32 mseconds=flow_t.racetime;//时间
if(speed >0){
if(flow_t.dir==CW) {PUMPDRAIN; usSRegHoldBuf[ADDR_SingTASK_flag] = 1;usSRegHoldBuf[ADDR_pump_flag] = 1; }
//抽
else {PUMPPUSH; usSRegHoldBuf[ADDR_SingTASK_flag] = 2; usSRegHoldBuf[ADDR_pump_flag] = 2;} //推
setMotorFrq(speed); //设置转速
if(motorctrl_flag == 0){
rt_kprintf("pump 未在运行\n");
drvPulseExecute(ENABLE);//开
initmotorRaceTimer(mseconds);
rt_timer_start(&motorRaceTime);
motorctrl_flag =1;
}
while(1)
{
/* 接收事件,事件触发,接收完后清除事件标志 */
if (rt_event_recv(&raceEvent, (EVENT_FLAG1),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_TIMEOUT;//电机运行超时;
if(debuggg >=3){
rt_kprintf("pump overtime stop:racetime=%d,speed=%f,dir=%d\n", mseconds,speed*100,flow_t.dir);}
break;
}
if (rt_event_recv(&raceEvent, (EVENT_FLAG6),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
pumpTurn_stop();
if(debuggg >=3){
rt_kprintf("MOTOR_TIMEOK stop:racetime=%d,speed=%f,dir=%d\n", mseconds,speed*100,flow_t.dir);}
motor_move_result_flag = MOTOR_TIMEOK;//电机运行时间到
break;
}
//check liquid level3 检查液位开关 高
if (rt_event_recv(&tripEvent, (EVENT_FLAG2),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{ getMTLIOLowState();
if(flow_t.htierchk)//设置需要检测高水位
{
if(mt.top==LEVELUP)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_TOPOK ;//高停止
if(debuggg >=3){
rt_kprintf("pump top stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100);}
break;
}
}
}
if (rt_event_recv(&tripEvent, (EVENT_FLAG3),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
getMTLIOLowState();
if(flow_t.htierchk)//设置需要检测高水位
{
if(mt.top==LEVELDN)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_TOPOK ;//高停止
if(debuggg >=3){
rt_kprintf("pump top stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100);}
break;
}
}
}
//check liquid level2 中
if (rt_event_recv(&tripEvent, (EVENT_FLAG4),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
getMTLIOLowState();
if(flow_t.mtierchk)
{
if(mt.mid==LEVELUP)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_MIDOK ;//中停止
if(debuggg >=3){
rt_kprintf("pump mid stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100);}
break;
}
}
}
if (rt_event_recv(&tripEvent, (EVENT_FLAG7),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
getMTLIOLowState();
if(flow_t.mtierchk)
{
if(mt.mid==LEVELDN)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_MIDOK ;//中停止
if(debuggg >=3){
rt_kprintf("pump mid stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100);
}
break;
}
}
}
//check liquid level1 低
if (rt_event_recv(&tripEvent, (EVENT_FLAG5),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
getMTLIOLowState();
if(flow_t.ltierchk)
{
if(mt.bot==LEVELUP)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_BOTOK ;
if(debuggg >=3){
rt_kprintf("pump bot stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100);
}
break;
}
}
}
if (rt_event_recv(&tripEvent, (EVENT_FLAG8),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK)
{
getMTLIOLowState();
if(flow_t.ltierchk)
{
getMTLIOLowState();
if(mt.bot==LEVELDN)
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_BOTOK ;
if(debuggg >=3){
rt_kprintf("pump bot stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100);
}
break;
}
}
}
if(usSRegHoldBuf[ADDR_run_pump_task]==3)//泵停止命令
{
pumpTurn_stop();
motor_move_result_flag = MOTOR_STOPOK ;
usSRegHoldBuf[ADDR_run_pump_task]=0;
break;
}
if(usSRegHoldBuf[ADDR_return_ACTION] == 1)
{
rt_kprintf("usSRegHoldBuf[ADDR_return_ACTION]=%d\n", usSRegHoldBuf[ADDR_return_ACTION]);
break;
}
}
}else pumpTurn_stop();
}