对比在裸机下实现的该功能,裸机目前是正常的,并未出现上诉问题。怀疑是系统调度等引起的问题,有大神可以指导下么
代码如下
static rt_err_t motor_S_curve_set(struct rt_device *device, motor_para_t *para, acc_config_t *acc_cfg)
{
struct pwm_motor_cfg *pwm_cfg = (struct pwm_motor_cfg *)device->user_data;
CalcSpeed(pwm_cfg,acc_cfg);//根据参数生成加减速频率表
pwm_cfg->cal_para.AverageStep = para->pulse - 2 * pwm_cfg->cal_para.AccelTotalStep;
if(pwm_cfg->cal_para.AverageStep <= 0) pwm_cfg->cal_para.AverageStep = 0;
stepper_start_run(pwm_cfg);//启动第一个pwm输出,开中断
rt_sem_take(&pwm_cfg->sem,RT_WAITING_FOREVER);
rt_free(pwm_cfg->cal_para.Form);
return RT_EOK;
}
void speed_decision(void *args)
{
float temp_p = 0;
int step;
struct pwm_motor_cfg *cfg = (struct pwm_motor_cfg *)args;
if(cfg->status.status == ACCEL)
{
cfg->status.pos++;
if(cfg->status.pos < cfg->cal_para.AccelTotalStep )
{
temp_p = cfg->cal_para.Form[cfg->status.pos];
// if(temp_p < MIN_SPEED)
// temp_p = MIN_SPEED;
QTMR_SetupPwm(cfg->base,cfg->channel,temp_p,50,false,QTMR_SOURCE_CLOCK/8);
}
else
{
if(cfg->cal_para.AverageStep > 0) cfg->status.status = AVESPEED;
else if(cfg->cal_para.AverageStep == 0) cfg->status.status = DECEL;
else //到达最大速度后不减速,给信号量
{
rt_sem_release(&cfg->sem);
}
}
}
else if(cfg->status.status == AVESPEED)
{
cfg->status.pos++;
if(cfg->status.pos < cfg->cal_para.AccelTotalStep + cfg->cal_para.AverageStep) ;
else cfg->status.status = DECEL;
}
else
{
cfg->status.pos++;
step = cfg->status.pos - cfg->cal_para.AccelTotalStep - cfg->cal_para.AverageStep;
if(step < cfg->cal_para.AccelTotalStep)
{
temp_p = cfg->cal_para.Form[cfg->cal_para.AccelTotalStep - step];
if(temp_p < MIN_SPEED)
temp_p = MIN_SPEED;
QTMR_SetupPwm(cfg->base,cfg->channel,temp_p,50,false,QTMR_SOURCE_CLOCK/8);
}
else
{
cfg->status.status = STOP;
QTMR_StopTimer(cfg->base,cfg->channel);
rt_sem_release(&cfg->sem);
}
}
}
static void qtimer_isr(TMR_Type *base, int start)
{
QTMR_ClearStatusFlags(base, kQTMR_Channel_3, kQTMR_Compare2Flag);
hdr_tab[11].hdr(hdr_tab[11].args);
}
void TMR3_IRQHandler(void)
{
rt_interrupt_enter();
qtimer_isr(TMR3,8);
rt_interrupt_leave();
}
0