STM32編程L298N驅(qū)動(dòng)直流有刷電機(jī)實(shí)現(xiàn)PID位置、速度雙閉環(huán)控制實(shí)現(xiàn)
為實(shí)現(xiàn)完成PID控制需要使用STM32定時(shí)器的輸出通道和互補(bǔ)輸出通道共同控制引腳鏈接驅(qū)動(dòng)器驅(qū)動(dòng)電機(jī)和編碼器鏈接STM32 MCU定時(shí)器的編碼器接口來(lái)實(shí)現(xiàn)一個(gè)完成的驅(qū)動(dòng)、反饋閉環(huán),根據(jù)STM32MCU的數(shù)據(jù)手冊(cè)可以查詢定時(shí)器的各引腳的功能。


在相應(yīng)的.h資源文件利用宏定義實(shí)現(xiàn)功能引腳和指定功能的一一對(duì)應(yīng)


為了調(diào)試我們還定義了串口輸出引腳和按鍵控制引腳的定義


根據(jù)定義的引腳初始化以后就可以控制運(yùn)行狀態(tài)的進(jìn)程里編輯PID控制代碼了
? uwTick++;
? if((uwTick % 50) == 0)
? {
//? ? /* 獲取當(dāng)前位置值,編碼器4倍頻之后的數(shù)值 */
? ? Sample_Pulse = (OverflowCount*CNT_MAX) + (int32_t)__HAL_TIM_GET_COUNTER(&htimx_Encoder);
? ? /* 計(jì)算PID結(jié)果 */
? ? if(Start_flag == 1)
? ? {
? ? ? tmpPWM_DutySpd = LocPIDCalc(Sample_Pulse);
? ? ? /* 設(shè)定速度環(huán)的目標(biāo)值 */
? ? ? if(tmpPWM_DutySpd >= TARGET_SPEED)
? ? ? ? tmpPWM_DutySpd = TARGET_SPEED;
? ? ? if(tmpPWM_DutySpd <= -TARGET_SPEED)
? ? ? ? tmpPWM_DutySpd = -TARGET_SPEED;
? ? }
? }
? ? ? /* 速度環(huán)周期50ms */
? if(uwTick % 50 == 0)
? {
? ? /* 獲得當(dāng)前速度 */
? ? Sample_Pulse = (OverflowCount*CNT_MAX) + (int32_t)__HAL_TIM_GET_COUNTER(&htimx_Encoder);
? ? Spd_PPS = Sample_Pulse - LastSample_Pulse;
? ? LastSample_Pulse = Sample_Pulse ;
? ? /* 11線編碼器,270減速比,一圈脈沖信號(hào)是11*270*4 PPR */
? ? Spd_RPM = ((((float)Spd_PPS/(float)PPR)*20.0f)*(float)60);//單位是rpm
//
? ? /* 計(jì)算PID結(jié)果 */
? ? if(Start_flag == 1)
? ? {
? ? ? sPID.SetPoint = tmpPWM_DutySpd;
? ? ? PWM_Duty = SpdPIDCalc(Spd_RPM);
? ? ? if(PWM_Duty < 0)
? ? ? {
? ? ? ? Motor_Dir = CW;
? ? ? ? BDDCMOTOR_DIR_CW();
? ? ? ? PWM_Duty = -PWM_Duty;
? ? ? }
? ? ? else
? ? ? {
? ? ? ? Motor_Dir = CCW;
? ? ? ? BDDCMOTOR_DIR_CCW();
? ? ? }
? ? ? __HAL_TIM_SET_COMPARE(&htimx_BDCMOTOR,TIM_CHANNEL_1,PWM_Duty );
? ? }
? ? printf("LOC:%d Sped: %2.2f r/m \n",Sample_Pulse,Spd_RPM );
? }

