(STM32CubeMx生成HAL庫(kù))32最小系統(tǒng)板,按鍵控制42混合步進(jìn)電機(jī)啟停、變向、加減速
用的定時(shí)器1通道1生成pwm脈沖,改變ARR值改變脈沖頻率從而實(shí)現(xiàn)調(diào)速,采用按鍵中斷控制
直接上圖


引腳定義:
PA5 EN 使能 ? PA7 DIR/CW?? ?方向
PA8 PUL/CLK?? ?脈沖
KEY1 PA3 ? ?開啟3中斷
KEY2 PB11?? ??? ?開啟10到15中斷,10到15還是11到15引腳共用一個(gè)中斷
KEY3 PA1?? ??? ?開啟1中斷?? ?
KEY4 PA2 ? ?開啟2中斷
GPIO界面:

按鍵(要設(shè)置為中斷,exti這個(gè))用的非自鎖按鍵(輕觸開關(guān)),我用的下降沿觸發(fā),這邊應(yīng)該上升沿下降沿都可以,按鍵按下又彈起來了看個(gè)人需求吧,引腳設(shè)置為上拉高電平。


EN和DIR引腳,設(shè)置為推挽輸出(output push pull),引腳設(shè)置為低電平,EN低電平對(duì)應(yīng)電機(jī)非脫機(jī)狀態(tài),正常運(yùn)行;DIR低電平對(duì)應(yīng)電機(jī)逆時(shí)針旋轉(zhuǎn)狀態(tài)
科普一下:
推挽輸出的最大特點(diǎn)是可以真正能真正的輸出高電平和低電平,在兩種電平下都具有驅(qū)動(dòng)能力。
常說的與推挽輸出相對(duì)的就是開漏輸出,對(duì)于開漏輸出和推挽輸出的區(qū)別最普遍的說法就是開漏輸出無法真正輸出高電平,即高電平時(shí)沒有驅(qū)動(dòng)能力,需要借助外部上拉電阻完成對(duì)外驅(qū)動(dòng)。
NVIC中斷:





?就只用了定時(shí)器1通道1生成PWM波形

時(shí)鐘配置:


上代碼
主函數(shù):
#include "main.h"
#include "tim.h"
#include "gpio.h"
void SystemClock_Config(void);
static void MX_NVIC_Init(void);
uint16_t speed = 1000-1;
int main(void)
{
? HAL_Init();
? SystemClock_Config();
? MX_GPIO_Init();
? MX_TIM1_Init();
? MX_NVIC_Init();
HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);//打開定時(shí)器1通道1
? while (1)
? {
?
? }
}
?中斷回調(diào)函數(shù):
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//內(nèi)容在回調(diào)函數(shù)里寫
{
if(GPIO_Pin == KEY1_Pin)//判斷按鍵1 PA3是否按下
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA, KEY1_Pin) == GPIO_PIN_RESET)//再次判斷按鍵是否按下
{
HAL_GPIO_TogglePin(GPIOA, EN_Pin);//原先EN端給的低電平,正常狀態(tài)運(yùn)行,非自鎖按鍵可快速切換使能狀態(tài)
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_Pin);//清除按鍵內(nèi)容
}?
if(GPIO_Pin == KEY2_Pin)//判斷按鍵2 PB11是否按下
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOB, KEY2_Pin) == GPIO_PIN_RESET)//再次判斷按鍵是否按下
{
HAL_Delay(20);
HAL_GPIO_TogglePin(GPIOA, DIR_Pin);//原先DIR端給的低電平,逆時(shí)針轉(zhuǎn)動(dòng)
__HAL_TIM_SetAutoreload(&htim1,1000-1);//恢復(fù)默認(rèn)速度
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY2_Pin);
}?
if(GPIO_Pin == KEY3_Pin)//判斷按鍵3 PA1是否按下
{
HAL_Delay(20);
if((HAL_GPIO_ReadPin(GPIOA, KEY3_Pin) == GPIO_PIN_RESET)&&(speed>100))//再次判斷按鍵是否按下
{
HAL_Delay(20);
speed -= 100; //速度增加
__HAL_TIM_SetAutoreload(&htim1,speed);
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY3_Pin);
}?
if(GPIO_Pin == KEY4_Pin)//判斷按鍵4 PA2是否按下
{
HAL_Delay(20);
if((HAL_GPIO_ReadPin(GPIOA, KEY4_Pin) == GPIO_PIN_RESET)&&(speed < 2000))//再次判斷按鍵是否按下
{
HAL_Delay(20);
speed += 100; //速度減小
__HAL_TIM_SetAutoreload(&htim1,speed);
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY4_Pin);
}?
}
提示:
__HAL_TIM_SetAutoreload(&htim1,speed)函數(shù)是用來改變脈沖輸出頻率的,speed在這里就類似于ARR計(jì)數(shù)周期了
