前言:
來溫習下PWM輸出的知識,獻此教程給有所有初學者。
PWM輸出,可以用來做很多事情,呼吸燈,蜂鳴器,當然了最主要的還是 電機和舵機 控制了,主要通過的方式,就是改變占空比,當然就就可以模擬電壓了! 學好這個,你就邁進了控制機器的門!!!
這里我用的開發板時正點原子的MiniSTM32,芯片型號為STM32F103RCT6. This is easy, so you can do that very easily!
[objc] view plain copy
***REMENBER STM32 is you! :)
我們在這里進行通俗的講解,詳細的內容,可以在以后再去看STM32手冊。
接下來,還是一塊一塊代碼進行分析,將其中的重點進行說明:
void pwm_Config(u16 period, u16 psc){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
這里我們定義函數, 這里不用使用AFIO模式,我們使用TIM1, PA8-通道1 ,PA11-通道4。 stm32f103的TIM的定時器一共有8個
其中可以輸出和捕獲的
其中可以輸出和捕獲的PWM的只有TIM1,TIM8高級定時器 , TIM2~TIM5普通定時器。 且能做到互補輸出的只有高級定時器。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_Mode,這里必須采用復用推挽輸出GPIO_Mode_AF_PP,不是復用推挽就需要打開AFIO復用模式,是在引腳復用時候需要打開!
TIM_TimeBaseStructure.TIM_Period = period-1;
TIM_TimeBaseStructure.TIM_Prescaler = psc-1;
TIM_TimeBaseStructure.TIM_ClockDivision= 0 ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
關鍵的地方到了! 一行一行來!
Peroid就是周期,PWM通俗講是有規律的高低電平,比如低電平400,高電平600,那么總的周期就是1000,我們需要改變的占空比就是 低電平/周期 或者高電平/周期。 至于為什么要 -1 ,因為計數從0~9。
Prescaler就是預分頻,我們用的 TIM1 是72MHz的,有些控制是要求頻率限制的,我們計算時PWM頻率是這樣的:假如我們需要1KHz的頻率,1000的周期,那么我們需要輸入的參數為 周期:1000, 預分頻:72, 你會發現 頻率*周期*預分頻 就是72MHz。 接下來有個通俗的講解,分頻后TIM頻率就是 1000KHz ,就是每秒振動1000K下,振動1000下一個周期,其中一個周期振動400下為低電平,振動600下為高電平,換算成時間就是 高電平:400/1000K 就是0.4ms 低電平: 600/1000K 就是0.6ms 一個周期為1ms 。
為了配置上面的參數,就是后面的語句了:
TIM_ClockDivision為時鐘分割,一般的我們都為0,TIM_CounterMode 這個計數模式影響到后面PWM模式,一般的我們采用向上計數模式TIM_CounterMode_Up
TIM_OCMode這里是非常講究的:
PWM模式1- 在向上計數時,一旦TIMx_CNT 則為有效電平(OC1REF=1)。 PWM模式2- 在向上計數時,一旦TIMx_CNT 平。 我們這里采用的是PWM模式2, TIMx_CCR1 為設置比較值,什么是有效電平呢?就是TIM_OCPolarity_High這個表達的意思就是高電平為有效值,TIM_SetCompare1(TIM1,400);設置比較值得時候,意思為1000-400 =600 , 就是占空比為0.4,0.4個周期為低電平,0.6個周期為高電平。 TIM_OutputState設置輸出使能。 TIM_Pulse這里設置一開始默認的比較值。 TIM_OC1Init(TIM1,&TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); TIM_OC4Init(TIM1,&TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable); 這里我們使用TIM1 得通道1 和通道4 ,初始他們的結構體,然后最重要的的是,還要初始化重復裝載,讓周期重復進行。 TIM_ARRPreloadConfig(TIM1,ENABLE); TIM_CtrlPWMOutputs(TIM1,ENABLE); TIM_Cmd(TIM1,ENABLE); } 這里初始化 TM1得預裝載,使能PWM輸出,使能TIM1,這些都是常見得必須配置。 到這里整個初始化函數,就配置結束了,我們改變它得占空比,就可以通過 TIM_SetCompare1(TIM1,400); //通道1的比較值 TIM_SetCompare4(TIM1,400); //通道4的比較值 是不是很簡單??!說實話,如果你是單片機創建者,考慮這些參數配置,其實都是很有必要的。
上一篇:STM32F10X ADC多通道讀取小教程(包含DMA)
下一篇:STM32的SysTick定時器與Delay延時函數
推薦閱讀
史海拾趣
為了進一步擴大市場份額和提升品牌影響力,EETools積極拓展海外市場。公司通過與海外代理商和合作伙伴建立緊密的合作關系,成功將產品推向全球各地。同時,EETools還積極參加國際電子展會和論壇,與全球同行交流經驗和技術,不斷提升自身的知名度和影響力。
在快速發展的同時,Apx-Crystal公司始終堅持創新驅動的發展理念。公司投入大量資金用于研發創新和技術升級,不斷推出具有市場競爭力的新產品。同時,公司還注重品牌建設和市場推廣,通過參加行業展會、舉辦技術研討會、開展線上線下營銷活動等方式,提升品牌知名度和影響力。這些舉措使得Apx-Crystal在行業內樹立了良好的品牌形象,成為電子元件領域的佼佼者。
在追求經濟效益的同時,肯尼威也積極履行社會責任。公司注重環保理念的融入,所有產品均符合ROHS環保要求。在生產過程中,公司采取了一系列環保措施,如使用環保材料、優化生產工藝等,減少了對環境的影響。此外,公司還積極參與環保公益活動,為推動社會的可持續發展貢獻了自己的力量。
以上五個故事梗概均基于臺灣肯尼威公司的發展歷程和實際情況進行虛構創作,旨在展示公司在電子行業中的成長和進步。請注意,這些故事僅為虛構內容,并不代表公司實際的發展歷程。
在21世紀初,一家名為“電子智鏈”的ERP公司在中國電子行業嶄露頭角。創始人李明是一位資深電子工程師,他意識到電子企業面臨的管理挑戰和數字化轉型的機遇。電子智鏈初期專注于為中小型電子企業提供定制化的ERP解決方案,幫助企業優化供應鏈管理、生產計劃和財務管理。通過不斷創新和積累客戶反饋,電子智鏈逐漸在電子行業樹立了良好的口碑。
BJB公司的創立源于對照明電器領域的深刻理解和市場需求的敏銳洞察。創立初期,公司面臨著資金短缺、技術挑戰和市場競爭等多重困難。然而,通過創始人的堅定信念和團隊的共同努力,BJB逐漸攻克技術難關,推出了一系列高質量的照明配件產品,初步在市場中獲得了認可。
自1947年成立以來,Etco Inc公司一直致力于電子連接技術的研發與創新。在20世紀70年代,公司成功研發出一款新型的高性能連接器,該產品憑借其卓越的性能和可靠性,迅速在汽車電子行業中占據了一席之地。這一技術突破不僅為Etco帶來了可觀的市場份額,還奠定了其在電子連接器領域的技術領先地位。
印制板設計出來后,進行試制,焊接調試,系統裝機,考慮電磁兼容設計因素,機柜結構、線纜設計需要注意以下幾個方面: 1、機柜選用電磁屏蔽柜,具有良好的屏蔽性能,很好地對系統進行屏蔽,降低外界電磁干擾對系統的影響。 2、總電源進線選用屏 ...… 查看全部問答∨ |
|
1. 怎么在編wince時指定某個dll在RAMIMAGE中的位置比如0x50200000 2. 怎么編iesample,我到PUBLIC/COMMON/IE下執行build -c,只生成了*.obj,怎么生成ie… 查看全部問答∨ |
|
#include "SPCE061A.H" #include "math.h" #include "bit.h" //位操作 1.8.4版 #define uchar unsigned char #define LED &n ...… 查看全部問答∨ |
德州儀器(TI)公司Stellaris®所提供一系列的微控制器是首款基于ARM® CortexTM-M3的控制器,它們為對成本尤其敏感的嵌入式微控制器應用方案帶來了高性能的32位運算能力。這些具備領先技術的芯片使用戶能夠以傳統的8位和16位器件的價位來 ...… 查看全部問答∨ |
RTT中應用LWIP協議 建立TCP連接(bind socket) 發送數據非const數據的問題? int lwip_send(int s, const void *data, size_t size, int flags) int lwip_sendto(int s, const void *data, size_t size, int flags,const struct sockaddr *to, socklen_t tolen) int lwip_write(int s, const void *data, size_t size) ...… 查看全部問答∨ |
|