本章節(jié)主要講解直流減速電機(jī)控制原理,電機(jī)驅(qū)動(dòng)電路,以及如何使用PWM控制直流減速電機(jī)
前言
1.軟件準(zhǔn)備:STM32CubeMx、Keil5_?MDK
2.硬件準(zhǔn)備:STM32F103C8T6核心板、TB6612電機(jī)驅(qū)動(dòng)模塊/L298N電機(jī)驅(qū)動(dòng)、18650鋰電池3節(jié)/3S航模電池、杜邦線若干
直流減速電機(jī)
? ? ? ?圖2-1為市場(chǎng)上常用的直流減速電機(jī)的圖片,減速電機(jī)由直流電機(jī)加上減速齒輪構(gòu)成。減速齒輪決定減速電機(jī)的減速比,減速比越大電機(jī)轉(zhuǎn)速越慢,力矩越大。減速電機(jī)一般驅(qū)動(dòng)電壓有 12V 和 24V 的,驅(qū)動(dòng)電壓越大同樣減速比減速電機(jī)對(duì)應(yīng)的力矩也就越大,同時(shí)耗電電流也會(huì)增加。
? ? ? ?下圖為某廠家 370減速電機(jī)的參數(shù)表,我們可以從表中看出與減速電機(jī)減速比和驅(qū)動(dòng)電壓相對(duì)應(yīng)的力矩、電流等參數(shù)的相關(guān)關(guān)系。
? ? ? ?直流電機(jī)有兩個(gè)引腳,當(dāng)我們正向給電機(jī)正向通電時(shí)電機(jī)正轉(zhuǎn),當(dāng)我們反向給電機(jī)通電時(shí)電機(jī)反轉(zhuǎn)。如圖 2-3 所示為,當(dāng)電機(jī)的 1 腳施加正極,2 腳施加負(fù)極時(shí)電機(jī)正轉(zhuǎn);電機(jī)的 2 腳施加正極,1 腳施加負(fù)極電機(jī)反轉(zhuǎn)。
?直流電機(jī)調(diào)速
???????對(duì)于電機(jī)的調(diào)速我們需要通過(guò)脈沖寬度調(diào)制(Pulse width modulation,PWM)來(lái)實(shí)現(xiàn),PWM 的占空比為高電平占整個(gè)調(diào)制周期的時(shí)間比例。
???????如圖 2-4 所示為脈沖寬度調(diào)制的的原理圖示,比如高電平時(shí)間為 8ms,低電平時(shí)間為 2ms時(shí),這是整個(gè)脈寬周期是為 10ms,占空比即為 80%。我們通過(guò)此波形來(lái)控制電機(jī)即可實(shí)現(xiàn)電機(jī)的速度控制,且占空比越高的話,高電平的比例越高,則電機(jī)速度就會(huì)越快,反之就越慢,一般PWM的頻率應(yīng)大于 1KHZ。當(dāng)然單片機(jī)引腳產(chǎn)生的這個(gè) PWM 波形肯定是不可能直接驅(qū)動(dòng)電機(jī)的,中間需要使用驅(qū)動(dòng)電路。
? ? ? ? 圖 2-5 左為單向電機(jī)驅(qū)動(dòng)電路,PWM 引腳為高電平時(shí) N 溝道 MOS 管導(dǎo)通,如果把電機(jī)看成電阻的話,這是電機(jī)兩端電壓應(yīng)該為 12V,PWM 引腳為低電平時(shí) N 溝道 MOS管截止,電機(jī)兩端電壓應(yīng)該為 0V。但實(shí)際電機(jī)并不能看成電阻。
? ? ? ? 圖 2-5 右的電路等效為右邊的電路,我們可以把電機(jī)看成一個(gè)電感,我們知道電感有儲(chǔ)能的作用,所以當(dāng) MOS管截止電感會(huì)釋放能量,所以電機(jī)兩端電壓并不是 0V。
? ? ? ? 同樣當(dāng) MOS 管導(dǎo)通時(shí)電感會(huì)吸收能量,所以電機(jī)兩端電壓也并不是 12V。而是與 PWM 占空比相關(guān),電機(jī)兩端電壓應(yīng)該為??????=??????????,??????為電機(jī)實(shí)際電壓,????????為占空比,???????為給電機(jī)供電電壓。
? ? ? ? 如果 PWM占空比為 80%,電機(jī)供電電壓為 12V 的話,此時(shí)電機(jī)的實(shí)際電壓應(yīng)為 9.6V,所以調(diào)PWM 占空比調(diào)節(jié)電機(jī)轉(zhuǎn)速也就是調(diào)節(jié)電機(jī)兩端電壓調(diào)節(jié)電機(jī)轉(zhuǎn)速。但是PWM 脈沖周期需要小于電感儲(chǔ)放能的時(shí)間。
電機(jī)驅(qū)動(dòng)電路
? ? ? ? 一般我們控制電機(jī)需要控制電機(jī)的正反轉(zhuǎn),一個(gè) MOS 管并不能滿足我們的需求,所以我們需要通過(guò) H 橋電路來(lái)實(shí)現(xiàn),H 橋需要 4 個(gè) MOSFET,這樣電路設(shè)計(jì)起來(lái)比較麻煩。市場(chǎng)上有幫我們搭建好的 H 橋電機(jī)驅(qū)動(dòng)芯片,這里我們用到的驅(qū)動(dòng)芯片為TB6612FNG,如下圖所示,
TB6612FNG介紹 ?
? ? ? ? 單片機(jī)引腳的電流一般只有幾十個(gè)毫安,無(wú)法驅(qū)動(dòng)電機(jī),因此一般是通過(guò)單片機(jī)控制電機(jī)驅(qū)動(dòng)芯片進(jìn)而控制電機(jī)。TB6612是比較常用的電機(jī)驅(qū)動(dòng)芯片之一。
? ? ? ? TB6612FNG可以同時(shí)控制兩個(gè)電機(jī),工作電流1.2A,最大電流3.2A。
AIN1/2、BIN1/2接單片機(jī)的GPIO口。PWMA/B接單片機(jī)的定時(shí)器口(配置為定時(shí)器PWM)。AO1/2、BO1/2接電機(jī)的正負(fù)極。
? ? ? ? PWMA、AIN1/2、AO1/2為一組驅(qū)動(dòng)一個(gè)電機(jī), PWMB、BIN1/2、BO1/2為一組驅(qū)動(dòng)另一個(gè)電機(jī)。
? ? ? ? STBY為正常工作、待機(jī)狀態(tài)控制引腳,一般接3.3V電即可。VM為電機(jī)驅(qū)動(dòng)電壓輸入(<12V,可接3S鋰電池),VCC為邏輯電平輸入端(2.7V~5.5V)。
用戶可通過(guò)配置AIN1/2、BIN1/2的電平狀態(tài)控制電機(jī)轉(zhuǎn)向,如下圖TB6612電機(jī)驅(qū)動(dòng)真值表,
? ? ? ?我們將VM和GND接入電源正極(6~12V,一般2-3節(jié)鋰電池)和負(fù)極(GND需要與主控板共地),PWMA接入主控板上PA6端口,AIN1接入主控板的PB12端口,AIN2接入主控板的PB13端口,STBY接入3.3V,AO1和AO2接入電機(jī)的正負(fù)極。
電機(jī)驅(qū)動(dòng)程序?qū)崿F(xiàn)
定時(shí)器配置和GPIO配置均通過(guò)STM32CUBEMX配置,本此教程不再贅述,詳細(xì)請(qǐng)見以往PWM配置教程STM32CubeMx使用教程(五)—— 使用PWM控制蜂鳴器演唱孤勇者
GPIO配置
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
/*Configure GPIO pins : PB12 PB13 PB14 PB15 */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
PWM配置
void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 72-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1000-1;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
電機(jī)控制代碼
/**************************************************************************
函 數(shù) 名:void motor_ctrl(int16_t left_speed,int16_t right_speed)
功 能:電機(jī)速度設(shè)定函數(shù)
入口參數(shù):left_speed左電機(jī)速度 right_speed右電機(jī)速度
**************************************************************************/
void motor_ctrl(int16_t left_speed,int16_t right_speed)
{
if(left_speed>=0) //左電機(jī)速度大于0時(shí),電機(jī)正轉(zhuǎn)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
}
else //電機(jī)反轉(zhuǎn)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
}
if(right_speed>=0)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
}
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, abs(left_speed));//將速度占空比賦給電機(jī)
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, abs(right_speed);
}
主函數(shù)?
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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);//開啟定時(shí)器PWM
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
motor_ctrl(500,-500);
HAL_Delay(5000);
motor_ctrl(-500,500);
HAL_Delay(5000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
具體實(shí)現(xiàn)
可以觀察到當(dāng)速度正反改變,電機(jī)轉(zhuǎn)動(dòng)方向也會(huì)改變。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-452968.html
PWM控制電機(jī)調(diào)速文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-452968.html
到了這里,關(guān)于STM32循跡小車系列教程(一)—— 使用PWM控制電機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!