HAL库配置STM32F1系列PWM驱动步进电机(二)
接著上一篇,我要先補完利用PWM對步進電機進行調速的實驗
PWM主要有兩大要素:頻率&占空比
頻率
簡單來說就是信號在1s內由高電平跳轉到低電平再跳轉回高電平的次數,一高一低再一高,這便是一個脈沖,一個脈沖對應一個步距角,一般步進電機的步距角分為1.8°和0.9°,因此我們需要轉動多少°只需要調節脈沖數即可,而步進電機的轉速則是受到脈沖發送頻率的影響
占空比
占空比就是在一個PWM周期中高電平占整個周期的比值,一個PWM周期即為1/PWM頻率,對于直流電機來說,其是由正負極控制運動,因此占空比越大電機轉速越快,對于步進電機來說占空比影響的是電機的轉矩,如果占空比過小可能會出現電機無法轉動的情況
電機驅動
現在再重新細說一下電機驅動的原理,這里由L298N為例
步進電機工作原理
這是一個二相四線電機,其分為轉子和定子,在二者上帶有均分的小齒,不妨假設轉子齒數為60,定子齒數為40(每個磁極的極弧上有10個小齒),這樣定子上的齒距為θ = 360°/60 = 6°
不難得出這樣的設計會發生齒錯位現象,即當定子A的某一齒對準轉子齒時,B相的齒就會與轉子偏移[(60-40)/40]*θ?= 3°,因此每個通電脈沖驅動電機轉動3°,按照一定的節拍規律就可以實現電機的正轉反轉以及角度。而驅動四線兩相電機,四個狀態為1、AB正電壓;2、A-B正電壓;3、A-B-正電壓;4、AB-正電壓。也就是說我們只需要控制4個IO的電平信號就可以實現對電機的控制
L298N電機驅動
考慮到我之前用的智控驅動集成度過高,不適合初學的我學習,我找了一個很常見的電機驅動模塊
L298N是意法半導體集團旗下量產的一種電機驅動芯片,擁有工作電壓高、輸出電流大、驅動能力強、發熱量低、抗干擾能力強等特點,通常用來驅動繼電器、螺線管、電磁閥、直流電機以及步進電機。
具體信息可以翻閱芯片手冊
回到我們的紅板模塊上
其由一個L298N電機驅動芯片以及78M05穩壓芯片組成,前者用于驅動電機,后者提供電流過熱保護,對應引腳如下,詳情可以跳轉這個鏈接查看L298N 電機驅動板 - 詳細介紹 - 知乎 (zhihu.com)
?
?這款芯片模塊可以帶兩個直流電機或者一個二相四線步進電機,這里標出的接口指的是步進電機的接線
如果是正常驅動電機,則ENA和ENB的兩個跳線帽都不用拔掉,若要通過PWM波進行驅動,則需要將PWM通道接到ENA靠近絲印一側的引腳上
?工程以及代碼
建立工程
這樣就可以生成工程了?
代碼部分
? #define L298NA1(state) HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,state) #define L298NA2(state) HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8,state) #define L298NB1(state) HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,state) #define L298NB2(state) HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,state) //定義信號線對應到電機的每個節拍號? void Pulse(unsigned char nInputData ,unsigned char nDirection) //電機走一個步距角(四個節拍) {if(nDirection == 1){switch (nInputData) {case 1:{L298NA1(0);L298NA2(1);L298NB1(0);L298NB2(1);}break;case 2:{L298NA1(0);L298NA2(1);L298NB1(1);L298NB2(0);}break;case 3:{L298NA1(1);L298NA2(0);L298NB1(1);L298NB2(0);}break;case 4:{L298NA1(1);L298NA2(0);L298NB1(0);L298NB2(1);}break;}}else if(nDirection == 0){switch (nInputData) {case 1:{L298NA1(1);L298NA2(0);L298NB1(0);L298NB2(1);}break;case 2:{L298NA1(1);L298NA2(0);L298NB1(1);L298NB2(0);}break;case 3:{L298NA1(0);L298NA2(1);L298NB1(1);L298NB2(0);}break;case 4:{L298NA1(0);L298NA2(1);L298NB1(0);L298NB2(1);}break;}} } uint8_t Key_on() //按鍵檢測 {uint8_t KeyNum=0;if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==RESET){HAL_Delay(20);KeyNum = 1;}if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==RESET){HAL_Delay(20);KeyNum = 2;}return KeyNum; } void Motor_Start(unsigned char n,unsigned char nDirection) //電機啟動函數,n代表要走多少個步距角,dir代表方向 {uint16_t i;uint8_t j;for(i=0;i<=n;i++){for(j=0;j<=4;j++){Pulse(j,nDirection);HAL_Delay(2);}} } void Motor_Start_PWM(unsigned char nDirection) //PWM模式。調用前要先打開PWM通道 {uint8_t j;for(j=0;j<=4;j++){Pulse(j,nDirection);HAL_Delay(2);} } int main(void) {/* USER CODE BEGIN 1 */uint16_t arr; //初始化存儲裝載值變量/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //打開PWM通道arr = __HAL_TIM_GET_AUTORELOAD(&htim3); //獲取當前裝載值/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Key = Key_on(); //檢測按鍵switch (Key) //對應模式{case 1:dir = !dir;Key = 0;break; //翻轉方向case 2:arr += 50;__HAL_TIM_SET_AUTORELOAD(&htim3,arr); //設置新的裝載值__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&htim3)/2); //確保占空比始終不變Key = 0;break; //電機減速}Motor_Start_PWM(dir); //啟動電機}/* USER CODE END 3 */ }實驗現象
不出以外電機就開始轉動了,經測試方向控制以及調速部分均無問題
?
總結
以上是生活随笔為你收集整理的HAL库配置STM32F1系列PWM驱动步进电机(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水费管理系统
- 下一篇: MySQL最全整理!高级java开发工程