系列文章目錄?
·【STM32】新建工程模板及配置
·【STM32】STM32與PC端、HC-06、ROS進行USART串口通信
·【ROS】ROS上位機使用Serial庫和boost::asio庫與STM32進行USART通訊
·【STM32】STM32F103C8T6+L298N通過PWM控制直流電機轉(zhuǎn)速
·【STM32】STM32F103C8T6使用外部中斷法和輸入捕獲法進行編碼器測速
·【STM32】STM32F103C8T6實現(xiàn)直流電機速度PID控制
目錄
系列文章目錄
前言
一、PWM調(diào)速原理
二、STM32編程實現(xiàn)
總結(jié)
前言
原來做的差速小車是基于Arduino控制的,感覺有些簡單,也有些基礎,Arduino方便簡單的同時,可操作性感覺也少了很多,所以想將控制器換成STM32,然后將樹莓派作為上位機,STM32作為下位機,通過樹莓派和STM32進行通訊,實現(xiàn)對差速移動小車的控制,本人也是寒假期間初學STM32,也是奔著應用去的,所以對于STM32編程原理方面可能不太精通,這里偏重于記錄應用層面的知識。
一、PWM調(diào)速原理
直流電機驅(qū)動是最簡單的,給電機通上電就能轉(zhuǎn),根據(jù)電機的公式:
可知:當提高電壓時,反電勢升高,進而轉(zhuǎn)速升高,電壓與轉(zhuǎn)速大致有如圖所示的關系
所以我們只要控制給電機通電的電壓即可控制電機的轉(zhuǎn)速,但是在實際的控制中,控制直流電機需要通過H橋控制電機的正反轉(zhuǎn),如圖,當T1和T4二極管導通時,有粉色通路;當T2和T3二極管導通時,有藍色通路,這樣我們就可以實現(xiàn)弱電控制強電,通過二極管的通斷來控制電機的轉(zhuǎn)向。
但是這樣電機通電時電壓就是Us,我們?nèi)绻胱杂傻目刂芔s的電壓值基本是不能實現(xiàn)的,因為電機是接到單片機的引腳上的,引腳的供電電壓值是確定的,我們就要使用控制二極管的通斷時間對電機的轉(zhuǎn)速進行控制,即PWM控制。
圖中的D1~D4二極管為續(xù)流的作用,因為電機中有繞組,在斷電后,電感的電流不能瞬時變?yōu)?,所以在斷電后電流沿棕色和綠色的通路放點。
? ? ? ?
?在一個周期內(nèi),我們通過控制通電的時間就可以調(diào)控平均電壓,而平均電壓的高低直接控制電機的轉(zhuǎn)速,通電時間/周期,就可以得到占空比,我們也就是通過控制電機的占空比來控制電機的轉(zhuǎn)速的。
?在實際應用過程中,我們不用自己搭建H橋,而是使用電機驅(qū)動板(如:L298N)對直流電機進行驅(qū)動,L298N內(nèi)搭載兩個H橋電路,可以實現(xiàn)對兩個電機的轉(zhuǎn)向和轉(zhuǎn)速進行控制。
?這是淘寶商家提供的電機驅(qū)動板控制表,將IN1~4接到單片機的引腳,我們就可以通過引腳輸出PWM控制信號,對直流電機進行控制。
二、STM32編程實現(xiàn)
在STM32中如果想輸出PWM信號,需要借助定時器,通過定時器的捕獲/比較通道的PWM輸出
?當我們對定時器設置了預裝載值arr和比較值ccr后,可以通過配置PWM模式,使定時器CNT計數(shù)值超過ccr后產(chǎn)生有效信號,并通過配置相應寄存器設置有效信號是1還是0,而配置PWM的輸出方式,具體原理信息可以參考原子哥的視頻,也可以參考中文參考手冊的14.4.7內(nèi)容。
?在程序中,我們使用庫函數(shù)進行配置,配置步驟如下:
?使能定時器和相關外設引腳時鐘 :RCC_APBxPeriphClockCmd()配置IO口為復用輸出模式(查手冊8.1.11)配置成相應的模式(復用推挽輸出)初始化定時器:TIM_TimeBaseInit()初始化TIM2 Channe1234 PWM模式:TIM_OCxInit()使能OCx通道的預裝載寄存器:TIM_OC1PreloadConfig()使能時鐘:TIM_Cmd()在主函數(shù)中配置占空比進行調(diào)速:TIM_SetCompare1()
#include "sys.h"/********************
功能:通用時鐘2用來產(chǎn)生通道1234四路PWM信號
函數(shù):TIM2_PWM_Init(u16 arr,u16 psc)
作者:K.Fire
日期:2022.01.30
引腳:PA0 PA1 PA2 PA3
參數(shù):arr:自動重裝值 psc:時鐘預分頻數(shù)
*****************/void TIM2_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//使能GPIOA外設模塊時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //設置引腳為復用輸出功能,輸出TIM2 CH1的PWM脈沖波形 GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM2_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//設置引腳為復用輸出功能,輸出TIM2 CH2的PWM脈沖波形 GPIOA.1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM2_CH2GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//設置引腳為復用輸出功能,輸出TIM2 CH3的PWM脈沖波形 GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2_CH3GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//設置引腳為復用輸出功能,輸出TIM2 CH4的PWM脈沖波形 GPIOA.3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2_CH4GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//使能定時器2時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //初始化TIM2TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數(shù)的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位//初始化TIM2 Channe1234 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設TIM2 OC1TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設TIM2 OC2TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設TIM2 OC3TIM_OC4Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設TIM2 OC4TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的預裝載寄存器TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預裝載寄存器TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR3上的預裝載寄存器TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR4上的預裝載寄存器TIM_Cmd(TIM2, ENABLE); //使能TIM2}
總結(jié)
原理部分我講的不清晰,我也是看原子哥的視頻學的,大家可以通過傳送門去B站看原子哥的視頻,先更新PWM調(diào)速,因為這一部分我測試成功了,等我編碼器來了在對編碼器和藍牙進行測試。
總結(jié)
以上是生活随笔為你收集整理的【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。