pwm波如何控制电机代码_PWM波控制720电机
詳細方案四:pwm與720電機控制
電機硬件分析
什么是電機?
電機(俗稱"馬達")是指依據電磁感應定律實現電能轉換或傳遞的一種電磁裝置。它的主要作用是產生驅動轉矩,作為用電器或各種機械的動力源。其中本四軸采用的電機是直流電機。直流電動機是將直流電能轉換為機械能的電動機。因其良好的調速性能而在電力拖動中得到廣泛應用。
圖1 直流電機圖那么是不是直接在電機兩端加上電壓就可以了?
直接在直流電機加上電壓,確實能夠使得電機轉動而且轉速完全能夠滿足四軸飛行的動力,但是這樣的四軸沒法控制電機的轉速,加電后四軸只會朝天上飛而且沒法控制。最后有可能炸機。
那怎么控制電機的轉速?
直流電動機是將直流電能轉換為機械能的電動機,也就是說只要控制住電流的話,就可以控制電機的轉速了。那問題就變成了如何控制電流了。
電流怎樣控制電機的轉速?
我們想想,有電流電機就轉,沒電流電機就不轉。那如果、10ms內,如果6ms電機有電流,4ms沒電流。電機是前6ms轉,后4ms不轉?實際上是10ms電機都在轉。前6ms電機有電流電機轉,后4ms雖然沒有電流但是由于慣性的作用電機依舊在轉,只不過轉速在不斷的減少。如果將將10ms的周期不斷的循環,不斷認為地控制電流的導通的時間是不是就可以控制電機的轉速了。其中這周期不能太大一般為ms或者ns級別的。
圖2 電流控制電機那么問題又來到了怎么控制電流上了
根據歐姆定律,在電阻不變的情況下,電壓與電流成正比。高電平就是有電流流經電機,低電平就是電路斷開沒有電流流經電機。這個讓電流能否流進電機就好像一個門閥且該門閥的開關的速度要達到ms和ns級別,那這門閥無疑MOS管是最佳人選。外加電壓在MOS管在柵源極上如果大于MOS的開啟電壓MOS管內部就會導通,如果外加柵源極小于MOS的開啟電壓MOS管處于截止區,也就是該電路斷開
最后的難題是電壓
有什么電壓能夠在周期內輸入穩定的高低電平到MOS管的柵源極?那就屬PWM波最好了。
圖3 pwm波定義圖PWM波即是通過單片機在一個周期內,讓單片機的IO口輸出一段時間的高電平,一段時間的低電平。如上圖所示為為一個方波的周期,其占空比為t/T。其調節高低電平過程如下圖
圖4 pwm波調制圖本四軸電機采用的是720空心杯電機。電機的驅動原理是通過STM32芯片IO口輸出PWM波(調節高電平的占空比)然后經過NMOS管來驅動電機的轉速其電路圖如下:
圖5 電機原理圖電路分析:
單片機IO口輸出PWM波給電路,后經過R8和R10分壓(防止電壓直接加載到NMOS導致擊穿同時也保證了柵源電壓大于開啟電壓)
如果此時的PWM波電壓處于高電平那么NMOS管導通,此時電池提供的電壓和電流經過電機接地。如果此時PWM波電壓處于低電平NMOS管就會截止,電路斷開沒法接地電機轉動的速度逐漸減少,只有等到下一個高電平來臨的時候電機的轉速才會提升。
電路中的電容的作用是去耦的作用,由于電機在轉動的時候會產生磁場導致電機的電壓上下波動,該電壓有濾波的左右
此外在電機一旁并聯二極管是因為電機在減速產生了電磁感應會有微弱的電流,防止它內流。二極管有分流消耗的作用。
軟件分析
本四軸采用的是STM32F411單片機芯片。本次采用的是PWM1模式使用的時鐘是TIM3
單片機該如何產生PWM波?
圖6 單片機產生pwm波定義圖- 如上圖所示,假設單片機某IO口是鋸齒波。其中ARR是單片機計數器的上限。單片機首 ?先開啟TIM3定時器從0計數到ARR后又從0重新開始計數到ARR不斷的循環重復。
- 在0到ARR的計數期間單片機內部存在一個CCRX的輸入捕獲比較器,里面裝載著參考電壓。用來比較鋸齒波的電壓是否大于參考電壓。如果大于那么IO口輸出高電平,低于參考電壓則輸出低電平。
- 其中占空比就是高電平時間占據整個定時周期的時間,也就是
- 所以要調節占空比直接調節CCRX的值就可以了。
單片機產生PWM波的工作過程
圖7 單片機內部產生pwm結構圖- 如上圖所示,就是單片機產生pwm波的模式一,其中OCIM是控制pwm模式幾的。
- OCIM被配置為模式一計數模式是向上計數的時候,一旦TIMx CNT < CCR1時通道1為有效電平否則是無效電平。如果是向下計數模式的時候則是相反。
- 輸出的OC1ref有效電平到達CCIP寄存器前,則通過設計是否為1/0如果為1則說明有OC1ref輸出是高電平有效,反之為低電平。
- 最有CO1E是IO口中斷輸出使能,為1時信號能夠輸出,為0則禁止輸出
上述的PWM波產生過程圖的輸入的CNT與CCR1的比較究竟是怎么回事?
- CCR1其實是CCRx寄存器中的一個值,如上圖所示如果CCRx等于4且為向上計數時。0-3的為有效電平,若OCREF為1則為高電平有效,剩下的低電平有效,CCxIF則相反。
- 此外單片機的IO口輸出為PWM輸出功能,并非普通IO口所以在配置的時候要設置為復用的IO口輸出,期間還有到了TIM1定時器,所以還要將TIM3的定時器功能映射到IO口上。
編程前的準備
編程需要的步驟
①四個電機定義
②電機最大最小速度定義
③使能定時器和IO口時鐘
④初始化IO口為復用功能輸出和GPIO復用映射到TIM3
⑤初始化定時器和輸出比較參數
⑥使能定時器
編程代碼
#include?"stm32f4xx.h"#include?"motor.h"
#define?Moto_PwmMax?1000
int16_t?MOTO1_PWM?=?0;
int16_t?MOTO2_PWM?=?0;
int16_t?MOTO3_PWM?=?0;
int16_t?MOTO4_PWM?=?0;
/******************************************************************************************
*函??數:void TIM3_GpioConfig(void)
*功??能:TIM3 PWM輸出通道GPIO設置
*參??數:無
*返回值:無
*備??注:TIM3 CH1(PWM1)?-> PA6
*????????TIM3?CH2(PWM2)?->?PA7
*????????TIM3?CH3(PWM3)?->?PB0
*????????TIM3?CH4(PWM4)?->?PB1
*******************************************************************************************/
void?TIM3_GpioConfig(void){
??GPIO_InitTypeDef?GPIO_InitStructure;
??RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,?ENABLE);?//TIM3?時鐘使能
??RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,?ENABLE);?//GPIOA?GPIOB?時鐘使能?
??
??//GPIOB?配置:?TIM3?CH1?(PA6),?TIM3?CH2?(PA7),?TIM3?CH3?(PB0)?and?TIM3?CH4?(PB2)?
??GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_AF;?//復用模式
??GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_100MHz;?//速度100M
??GPIO_InitStructure.GPIO_OType?=?GPIO_OType_PP;?//推完輸出
??GPIO_InitStructure.GPIO_PuPd?=?GPIO_PuPd_UP;?//上拉輸入
??//PA6?PA7?初始化?
??GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_6?|?GPIO_Pin_7?;
??GPIO_Init(GPIOA,?&GPIO_InitStructure);?
??//PB0?PB1?初始化
??GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_0?|?GPIO_Pin_1?;
??GPIO_Init(GPIOB,?&GPIO_InitStructure);?
??//連接?TIM3?的通道到?AF2?
??GPIO_PinAFConfig(GPIOA,?GPIO_PinSource6,?GPIO_AF_TIM3);
??GPIO_PinAFConfig(GPIOA,?GPIO_PinSource7,?GPIO_AF_TIM3);?
??GPIO_PinAFConfig(GPIOB,?GPIO_PinSource0,?GPIO_AF_TIM3);
??GPIO_PinAFConfig(GPIOB,?GPIO_PinSource1,?GPIO_AF_TIM3);?
}
/******************************************************************************************
*函??數:void MOTOR_Init(void)
*功??能:輸出PWM初始化
*參??數:無
*返回值:無
*備??注:TIMx_ARR ?決定方波的周期
*????????TIMx_CCRx?決定方波的占空比
*******************************************************************************************/
void?MOTOR_Init(void){
??TIM_TimeBaseInitTypeDef??TIM_TimeBaseStructure;
??TIM_OCInitTypeDef?TIM_OCInitStructure;
??RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,?ENABLE);
?
?
??TIM3_GpioConfig();
??//更新中斷時間?Tout?=?(ARR-1)*(PSC-1)/CK_INT
??//TIM2~TIM5時鐘來源于APB1*2
??TIM_TimeBaseStructure.TIM_Period?=?1000-1;?//自動重裝載值
??TIM_TimeBaseStructure.TIM_Prescaler?=?100-1;?//預分頻值
??TIM_TimeBaseStructure.TIM_ClockDivision?=?0;
??TIM_TimeBaseStructure.TIM_CounterMode?=?TIM_CounterMode_Up;
??TIM_TimeBaseInit(TIM3,?&TIM_TimeBaseStructure);
?
??//PWM1?模式配置?通道1
??TIM_OCInitStructure.TIM_OCMode?=?TIM_OCMode_PWM1;
??TIM_OCInitStructure.TIM_OutputState?=?TIM_OutputState_Enable;
??TIM_OCInitStructure.TIM_Pulse?=?0;
??TIM_OCInitStructure.TIM_OCPolarity?=?TIM_OCPolarity_High;
??TIM_OC1Init(TIM3,?&TIM_OCInitStructure);
??TIM_OC1PreloadConfig(TIM3,?TIM_OCPreload_Enable);?//電機1
??TIM_OC2Init(TIM3,?&TIM_OCInitStructure);
??TIM_OC2PreloadConfig(TIM3,?TIM_OCPreload_Enable);?//電機2
??TIM_OC3Init(TIM3,?&TIM_OCInitStructure);
??TIM_OC3PreloadConfig(TIM3,?TIM_OCPreload_Enable);?//電機3
??TIM_OC4Init(TIM3,?&TIM_OCInitStructure);
??TIM_OC4PreloadConfig(TIM3,?TIM_OCPreload_Enable);?//電機4
??//ARR?寄存器預裝載
??TIM_ARRPreloadConfig(TIM3,?ENABLE);
??//TIM_PrescalerConfig(TIM3,?PrescalerValue,?TIM_PSCReloadMode_Immediate);
?
??TIM_Cmd(TIM3,ENABLE);?//使能TIM3
}
/*****************************************************************************
*函??數:void Moto_Pwm(int16_t MOTO1_PWM,int16_t MOTO2_PWM,int16_t MOTO3_PWM,int16_t MOTO4_PWM)
*功??能:電機要輸出數值轉換成PWM波形輸出
*參??數:MOTO1_PWM 電機1
*????????MOTO2_PWM?電機2
*????????MOTO3_PWM?電機3
*????????MOTO3_PWM?電機4
*返回值:無?
*備??注:無
*****************************************************************************/
void?Moto_Pwm(int16_t?MOTO1_PWM,int16_t?MOTO2_PWM,int16_t?MOTO3_PWM,int16_t?MOTO4_PWM){??
?if(MOTO1_PWM>Moto_PwmMax)?MOTO1_PWM?=?Moto_PwmMax;
?if(MOTO2_PWM>Moto_PwmMax)?MOTO2_PWM?=?Moto_PwmMax;
?if(MOTO3_PWM>Moto_PwmMax)?MOTO3_PWM?=?Moto_PwmMax;
?if(MOTO4_PWM>Moto_PwmMax)?MOTO4_PWM?=?Moto_PwmMax;
?if(MOTO1_PWM<0)?MOTO1_PWM?=?0;
?if(MOTO2_PWM<0)?MOTO2_PWM?=?0;
?if(MOTO3_PWM<0)?MOTO3_PWM?=?0;
?if(MOTO4_PWM<0)?MOTO4_PWM?=?0;
?
?TIM3->CCR1?=?MOTO1_PWM;
?TIM3->CCR2?=?MOTO2_PWM;
?TIM3->CCR3?=?MOTO3_PWM;
?TIM3->CCR4?=?MOTO4_PWM;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的pwm波如何控制电机代码_PWM波控制720电机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误:docker-ce-cli con
- 下一篇: python卷子_Python试卷