C語言之「編程超簡單系列」——應用價值非常高的「PWM技術」
大家好,這兩天小編有點忙整天在加班,所以昨天沒有來得及更新,先給大家說聲抱歉。這幾天小編想了想,可能大家對C語言沒有那麼感興趣,也有可能是小編才疏學淺,沒有很好地傳達到學習的方法。如果是後者,先給大家說聲抱歉。小編覺得可能大家每天上班都挺累的,晚上逛頭條也是為了舒緩壓力,不想再去花腦筋想學習了,但是不管大家是否會為小編點贊,小編會堅持下去,因為我也不光是為了給大家分享學習心得,更多的是考量自己是否真正掌握這些學習過的東西,也就是溫故而知新吧!
呼吸燈
今天和大家討論一下「PWM」也就是「脈寬調製技術」,這項技術應用價值非常高,特別是在直流電機的控制領域。其實我說一些應用大家也很熟悉,比如「呼吸燈」,「調節屏幕的光亮程度」、「音量的大小」等等。那麼「脈寬調製技術」到底是怎麼應用的呢?我來給大家做個簡單的介紹:
大家都知道 功 = 功率 * 時間;那麼我們以「呼吸燈」為例,「呼吸燈」就是燈從微弱的亮度到最高亮度,然後在慢慢變成微弱的亮度;假設每種亮度持續的時間相同,那麼亮度高的時候所消耗的能量就多,亮度低的消耗的能量就少,也就是說他們之間的功率是不同的,但是我們都知道,給燈供電的引腳是相同的,那麼到底是如何改變功率的呢?這就是「脈寬調製技術」。和大家說過MCU執行的速度是很快的,這種速度是人類無法感知到的。假設每種亮度持續1ms;那麼亮度最高的燈的兩端電壓如下圖所示:
亮度最高
而中等亮度的燈的兩端電壓如下圖所示:
高度中等
從圖中就可以發現中等亮度的功率是最高亮度的一半,而在1ms甚至更短的時間內對管腳兩端的電壓進行變化,人類是無法感知出來的,人們所能感受到的只是亮度發生了變化。同理掌握了這個,你也就能控制直流電機的轉速了!你要控制亮度或者轉速,只要控制好低電平在一個周期中的時間就可以了,低電平在一個周期中所佔的比例稱為「占空比」,知道了這兩個因素,那麼使用「脈寬調製技術」就變得簡單了,就是設置好「周期(也就是頻率)」和「占空比」就可以了。
下面我們就圍繞設置「頻率」和「占空比」來學習就可以了。要告訴大家的是非常的簡單,因為STM32的定時器就帶有「PWM」功能,所以說設置PWM就變成了配置「定時器」在前幾章已經和大家討論過定時器的使用了,定時器初始化時就已經配置好了「周期(也就是頻率)」,PWM就是額外添加一段關於「占空比」的配置函數,要和大家說的PWM是自帶輸出引腳的,所以我們也要配置對應的輸出引腳,怎麼配置我相信學過前幾章的同學肯定都會了,那麼接下來就給大家寫一寫具體的配置:
//TIM14 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手動修改IO口設置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14時鐘使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF時鐘
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9復用為定時器14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式
TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定時器14
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM1 4OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的預裝載寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14, ENABLE); //使能TIM14
}
是不是很簡單,沒錯就是這麼簡單,在主函數中初始化該函數後,對應管腳就會按照你的設置輸出相應的高低電平,如果你降低占空比,輸出的功率就高,反之提高占空比,輸出的功率就低。
C
再次和大家強調一下,學習C語言嵌入式不要覺得有多難,這些底層的配置一般都是模塊化的,就算有些外設部件的配置比較複雜,網上也有很多底層程序,我們是做應用開發的,要花時間在應用層上,要學會去構思,底層的東西我們只要掌握一些通用的匯流排和一些MCU自帶的外設控制就OK了,還是那句話會思考的人才最有前途!
TAG:墨離 |