完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
环境:rtthread4.0.3 平台:I.MX 1052 最近在使用I.MX 1052 的QtiMER 输出PWM进行步进电机的S型控制曲线功能实现。目前功能已基本实现, 但是在波形输出上却出现了问题。 正常的波形如下: 第一个问题,在rtthread4.0.3系统下,当速度增大时,比如说加速至3r/s, 会出现偶尔中断有几个ms是没有pwm输出的,如下 有时会有好几段这样的无输出的波形,导致电机丢步。 第二个问题:有时出现的波形不为方波,如下,导致步数不准确。 对比在裸机下实现的该功能,裸机目前是正常的,并未出现上诉问题。怀疑是系统调度等引起的问题,有大神可以指导下么 代码如下 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(); } |
|
相关推荐
8个回答
|
|
|
|
|
|
仿真查看优先级,systick 和 PENDSV 都是15,TMR3的优先级目前是最高的,为3,但仍存在这个问题
|
|
|
|
我使用F407,采用梯形加速,控制步进,在Rt-thread下使用是没有问题的,你的裸机可以,RT-thread下已经关闭其他线程,中断优先级也已经设置好了,仍不行的话,建议检查下定时器和GPIO的驱动,是否有配置错误或冲突的地方
|
|
|
|
速度慢的时候是可以的,你那边pwm的最大输出的频率有多大。这边后级是电机驱动器,细分12800,在4r/s以上会丢步,2r/s是不丢步的。
|
|
|
|
目前测试下来电机驱动器细分数是6400的时候,S型加减速在6r/s是正常的,输出频率最大为38K左右,差不多25us进一次中断,速度在升上去,就出问题了。
|
|
|
|
我的系统TICK是1毫秒
#define RT_TICK_PER_SECOND 1000 也是输出脉冲到步进驱动器,但我的频率低些,梯形的运算也简单,S型加减速计算量会大一些。 但如果裸机是正常的,rt-thread下高转速就不行,说明有操作影响到了定时器中断, rt-thread 有些操作时,确实是需要关闭中断的,如rt_hw_interrupt_disable。但不应该出现长达几毫秒都没有脉冲输出。。。再仔细找找原因看看。 另外从实际角度出发,能否降低驱动器的细分数,进而降低pwm的输出频率,试试看能满足需求不? |
|
|
|
|
|
|
|
不清楚I.MX 1052的中断工作方式,按stm32的方式来说,即使在rt-thread关闭全局中断时,定时器发生了中断。当rt-thread打开全局中断后,也会立即响应定时器中断。而不是进不去中断。从你上面的图形看,长达3毫秒没有脉冲输出,猜测是没进入中断。可以在这里找下原因
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74835 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 07:25 , Processed in 1.081344 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号