最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

(STM32CubeMx生成HAL庫(kù))32最小系統(tǒng)板,按鍵控制42混合步進(jìn)電機(jī)啟停、變向、加減速

2023-05-15 12:52 作者:任你無言  | 我要投稿

用的定時(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中斷:

這邊有一個(gè)注意點(diǎn),因?yàn)樵谥袛嗷卣{(diào)函數(shù)里用到了延時(shí)函數(shù),這邊的Time base:System tick timer 優(yōu)先級(jí)要調(diào)整的比中斷優(yōu)先級(jí)要高,否則可能會(huì)沒反應(yīng),至于按鍵中斷都用一個(gè)優(yōu)先級(jí)也可以,我這邊是為了區(qū)分一下加減速的優(yōu)先級(jí)
這邊的Code generation界面里,第一列那個(gè)select那個(gè)方框記得選上,勾上之后,你用了幾個(gè)中斷下面就會(huì)顯示幾個(gè)中斷,不勾上的話,生成的代碼里是沒有的。

?就只用了定時(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ù)周期了


?我這個(gè)程序在調(diào)速這一塊會(huì)有點(diǎn)不太ok,有的時(shí)候可能頻率過高就停了,

然后就是調(diào)完速直接用變向按鍵,變向次數(shù)多了之后會(huì)不停加速,暫時(shí)搞不懂這個(gè)原因,我就在KEY2代碼那加了個(gè)每次都讓他返回一個(gè)固定速度的代碼


(STM32CubeMx生成HAL庫(kù))32最小系統(tǒng)板,按鍵控制42混合步進(jìn)電機(jī)啟停、變向、加減速的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
孟村| 绥化市| 平舆县| 通州市| 周口市| 高要市| 江津市| 阳泉市| 中阳县| 红桥区| 淮北市| 武鸣县| 阜康市| 二连浩特市| 巫山县| 泸州市| 林口县| 新和县| 津市市| 和林格尔县| 瑞金市| 青龙| 额尔古纳市| 勃利县| 长丰县| 黄陵县| 河源市| 昌图县| 阆中市| 鄂托克前旗| 磐安县| 东兴市| 田东县| 托里县| 大洼县| 栖霞市| 遵义县| 新邵县| 昭觉县| 深州市| 清水河县|