用STM32做直流电机驱动板,出现问题了

2019-07-21 00:41发布

用上位机给STM32直流驱动板发指令,STM32完成上位机指令后,但由于编码器计数未清零,指令不能连续发送,该怎么办?

[mw_shl_code=c,true]s32 pwm; extern s16 dAngle; //s16 Now_position; void Speed_control(s16 set_Position,s16 set_Speed) { pwm+=PID(set_Speed,dAngle); if(pwm>10000) pwm=9000; if(pwm<0) pwm=500; // TIM1->CCR1=pwm; if(set_Position==TIM2->CNT) { TIM1->CCR1=0x0000; TIM1->CCR2=0x0000; // delay_ms(1000); // flag=1; } else if(set_Position>TIM2->CNT) { TIM1->CCR1=pwm; TIM1->CCR2=0x0000; } else if(set_Position<TIM2->CNT) { TIM1->CCR1=0x0000; TIM1->CCR2=pwm; } } [/mw_shl_code] 用TIM2进行编码器计数,通过电脑串口设置set_Position(位置),set_Speed(速度)



设置转9000个脉冲,但由于电机惯性,编码器计数显示9231个脉冲,怎么让误差减小?

当驱动板完成指令电机停止后,怎么让编码器的计数清零,为下一次指令接收做好准备?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lycreturn
1楼-- · 2019-07-21 04:07
1.PID控制
2.usmart调试
心染红尘
2楼-- · 2019-07-21 06:25
回复【2楼】lycreturn:
---------------------------------
PID控制是先调位置,再调速度吗?
qq942266575
3楼-- · 2019-07-21 08:54
你需要PID算法。
double IDCalc(PID *pp,double NextPoint)
{
    double dError,Error;
    
    Error = pp->SetPoint - NextPoint;   
    pp->SumError += Error;            
    dError = pp->LastError - pp->revError; 
    pp->revError = pp->LastError;        
    pp->LastError = Error;               
    return (pp->roportion*Error          /*比例调节*/
            + pp->Integral*pp->SumError   /*积分补偿*/
            + pp->Derivative*dError);     /*微分补偿*/
}
心染红尘
4楼-- · 2019-07-21 14:44
 精彩回答 2  元偷偷看……
bg8wj
5楼-- · 2019-07-21 17:21
 精彩回答 2  元偷偷看……
toi666
6楼-- · 2019-07-21 19:24
有谁知道f4的dsp库的pid函数怎么用啊  想做一程序需要

一周热门 更多>