哈爾濱網(wǎng)站推廣公司有創(chuàng)意的網(wǎng)絡(luò)廣告案例
步進電機位置速度雙環(huán)控制實現(xiàn)
野火stm32電機教學(xué)
提高部分-第11講 步進電機位置速度雙環(huán)控制實現(xiàn)(1)_嗶哩嗶哩_bilibili
PID模型
位置環(huán)作為外環(huán),速度環(huán)作為內(nèi)環(huán)。設(shè)定目標(biāo)位置和實際轉(zhuǎn)軸位置的位置偏差,經(jīng)過位置PID獲得位置期望,然后講位置期望(位置變化反映了轉(zhuǎn)軸的速度)和實際轉(zhuǎn)軸速度作為差值,經(jīng)過速度PID獲得速度期望,然后控制步進電機的輸入脈沖頻率,調(diào)整電機轉(zhuǎn)速。
實驗環(huán)境
【*】 程序簡介
-工程名稱:步進電機-位置環(huán)控制-位置式PID
-實驗平臺: 野火STM32 F103 拂曉 開發(fā)板
【 !】功能簡介:
位置速度環(huán)例程 默認使用從PID調(diào)試助手界面打開串口
【 !】實驗操作:
下載本程序,復(fù)位開發(fā)板即可。
【 ?。 孔⒁馐马棧?步進電機驅(qū)動器使用32細分
/************************************************************/
步進電機驅(qū)動器接口1:PUL+<--->VCOMPUL-<--->PC6DIR+<--->VCOMDIR-<--->PE6ENA+<--->VCOMENA-<--->PE5
編碼器與步進電機的接線紅線+5V <------------>VENC黑線GND <------------->GNDA相藍線 <------------>PD12B相綠線 <------------>PD13Z相黃線 <------------>PD14屏蔽線()<------------>GND(沒有PIN屏蔽線的可以不接)
/*************************************************************************/
【*】 時鐘
A.晶振:
-外部高速晶振:8MHz
-RTC晶振:32.768KHz
B.各總線運行時鐘:
-系統(tǒng)時鐘 = SYCCLK = AHB = 72MHz
-APB2 = 72MHz
-APB1 = 36MHz
定時器輸出PWM控制步進電機
定時器8,通道1,時鐘頻率72MHz ,預(yù)分頻因子為16,重裝載值0xFFFF,
//Motor 脈沖
#define MOTOR_PUL_IRQn TIM8_CC_IRQn
#define MOTOR_PUL_IRQHandler TIM8_CC_IRQHandler#define MOTOR_PUL_TIM TIM8
#define MOTOR_PUL_CLK_ENABLE() __HAL_RCC_TIM8_CLK_ENABLE()#define MOTOR_PUL_PORT GPIOC
#define MOTOR_PUL_PIN GPIO_PIN_6
#define MOTOR_PUL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define MOTOR_PUL_CHANNEL_x TIM_CHANNEL_1#define MOTOR_TIM_IT_CCx TIM_IT_CC1
#define MOTOR_TIM_FLAG_CCx TIM_FLAG_CC1
/*頻率相關(guān)參數(shù)*/
//定時器實際時鐘頻率為:72MHz/TIM_PRESCALER
//具體需要的頻率可以自己計算
#define TIM_PRESCALER 16 /*補充:對F103例程測試,提高分頻利于位置環(huán)穩(wěn)定狀態(tài)*/
// 定義定時器周期,輸出比較模式周期設(shè)置為0xFFFF
#define TIM_PERIOD 0xFFFF
比較輸出模式的反轉(zhuǎn)模式
/********************************************************************************* @file bsp_stepper_init.c* @author fire* @version V1.0* @date 2019-xx-xx* @brief 步進電機初始化******************************************************************************* @attention** 實驗平臺:野火 STM32 F103 開發(fā)板 * 論壇 :http://www.firebbs.cn* 淘寶 :http://firestm32.taobao.com********************************************************************************/
#include "./stepper/bsp_stepper_init.h"TIM_HandleTypeDef TIM_StepperHandle;__IO uint16_t OC_Pulse_num = 65535; //比較輸出的計數(shù)值/*** @brief 中斷優(yōu)先級配置* @param 無* @retval 無*/
static void TIMx_NVIC_Configuration(void)
{/* 外設(shè)中斷配置 */HAL_NVIC_SetPriority(MOTOR_PUL_IRQn, 0, 0);HAL_NVIC_EnableIRQ(MOTOR_PUL_IRQn);
}/*** @brief 配置TIM復(fù)用輸出PWM時用到的I/O* @param 無* @retval 無*/
static void Stepper_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;/*開啟Motor相關(guān)的GPIO外設(shè)時鐘*/MOTOR_DIR_GPIO_CLK_ENABLE();MOTOR_PUL_GPIO_CLK_ENABLE();MOTOR_EN_GPIO_CLK_ENABLE();/*選擇要控制的GPIO引腳*/ GPIO_InitStruct.Pin = MOTOR_DIR_PIN; /*設(shè)置引腳的輸出類型為推挽輸出*/GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull =GPIO_PULLUP;/*設(shè)置引腳速率為高速 */ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;/*Motor 方向引腳 初始化*/HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct); /*Motor 使能引腳 初始化*/GPIO_InitStruct.Pin = MOTOR_EN_PIN; HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct); /* 定時器通道1功能引腳IO初始化 *//*設(shè)置輸出類型*/GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;/*設(shè)置引腳速率 */ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;/*設(shè)置復(fù)用*/GPIO_InitStruct.Pull =GPIO_PULLUP;/*選擇要控制的GPIO引腳*/ GPIO_InitStruct.Pin = MOTOR_PUL_PIN;/*Motor 脈沖引腳 初始化*/HAL_GPIO_Init(MOTOR_PUL_PORT, &GPIO_InitStruct);
}/** 注意:TIM_TimeBaseInitTypeDef結(jié)構(gòu)體里面有5個成員,TIM6和TIM7的寄存器里面只有* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的時候只需初始化這兩個成員即可,* 另外三個成員是通用定時器和高級定時器才有.*-----------------------------------------------------------------------------* TIM_Prescaler 都有* TIM_CounterMode TIMx,x[6,7]沒有,其他都有(基本定時器)* TIM_Period 都有* TIM_ClockDivision TIMx,x[6,7]沒有,其他都有(基本定時器)* TIM_RepetitionCounter TIMx,x[1,8]才有(高級定時器)*-----------------------------------------------------------------------------*/
void TIM_PWMOUTPUT_Config(void)
{TIM_OC_InitTypeDef TIM_OCInitStructure; /*使能定時器*/MOTOR_PUL_CLK_ENABLE();TIM_StepperHandle.Instance = MOTOR_PUL_TIM; /* 累計 TIM_Period個后產(chǎn)生一個更新或者中斷*/ ///當(dāng)定時器從0計數(shù)到TIM_PERIOD-1,即為TIM_PERIOD次