分享到plurk 分享到twitter 分享到facebook

版本 014f2a121c330d6c472997120c4e91b2ae4e15f1

embedded/PWM

Changes from 014f2a121c330d6c472997120c4e91b2ae4e15f1 to d54b086f37a6e40b25c8f6d4f3f7538bb365acb6

---
title: Pulse-width modulation(PWM)
...

Introduction
============


又稱pulse-duration modulation(PDM),是將類比信號轉為脈波的一種技術。

為何需要PWM?雖然類比電壓可直接用來控制,但類比電路控制信號容易隨時間漂移,功耗大。

.. image:: /pwm.png

如圖所示,PWM 電路主要功能是將輸入電壓的振幅轉換成脈衝寬度。一般轉換後脈波的週期固定,脈波的占空比(duty cycle)會依類比信號的大小而改變,可用來控制燈泡亮度、馬達轉速等等,脈波寬度越大燈泡亮度越亮、馬達轉速越快。


Implementation
==============
PWM需要透過Timer來實現,STM32的Timer可分為以下幾種

- 基本定時器(TIM6 和 TIM7)
- 高級控制定時器(TIM1 和 TIM8)
- 通用定時器TIMx(TIM2、TIM3、TIM4、TIM5):具有測量輸入信號的脈衝長度、產生輸出波形和PWM的功能。

- 通用定時器(TIMx):具有測量輸入信號的脈衝長度、產生輸出波形和PWM的功能。
  - clock來源 : 內部clock(CK_INT)、外部clock模式1(TIx)、外部clock模式2(ETR)、內部觸發輸入(ITRx)。
  - CK_INT -> AHB Prescaler(1、2、...、512倍) -> APB1 Prescaler(1、2、4、8、16倍) / APB2 Prescaler(1、2、4、8、16倍)。

一般:APB2下的时间为72MHz,APB1下的时间为 APB1x2   

The timer clock frequencies are automatically fixed by hardware. There are two cases:
         1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as
that of the APB domain to which the timers are connected.
        2. otherwise, they are set to twice (×2) the frequency of the APB domain to which the
timers are connected.


以LED為例:

.. image:: /timer.png

PWM 1 Mode : 在向上計數,TIMx_CNT<TIMx_CCRx時,輸出為1,否則輸出為0;在向下計數,TIMx_CNT>TIMx_CCRx時,輸出為0,否則輸出為1。

PWM 2 Mode : 在向上計數,TIMx_CNT<TIMx_CCRx時,輸出為0,否則輸出為1;在向下計數,TIMx_CNT>TIMx_CCRx時,輸出為1,否則輸出為0。

脈波週期 = TIM_Period * T_SYSCLK(1/168000000),以TIM_Period=2000為例,脈波週期 = 2000*(1/168000000)≒0.019ms,遠小於人眼視覺暫留的時間(0.1~0.4s),因此上圖的PWM 2 duty cycle(75%)>PWM 1 duty cycle(25%),PWM 2 Mode看起來會比PWM 1 Mode亮。


-----------


GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4); //將GPIO D12腳位與TIM4做連結



- //設定LED(即Pin12 13 14 15) 用來做PWM
- GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;      //設定這些腳位PWM模式 為交流(高-低)
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

-----------

- TIM_ClockDivision  //變數設定將clock做除頻
- TIM_Period         //設定週期數
- TIM_Prescaler      //
- TIM_OutputState    //設定Pin腳可以Output
- TIM_Pulse          //設定多少個脈衝以後做反應事件

- TIM_OC1Init( TIM4, &TIM_OCInitStruct ); //設定Timer4的CH1初使化

- TIM4->CCR1 //設定Timer幾個tik後發出脈衝


- CCR與Period關係示意圖在不同模式下



------------

Demo
============


Reference
============
http://zh.wikipedia.org/zh-tw/%E8%84%88%E8%A1%9D%E5%AF%AC%E5%BA%A6%E8%AA%BF%E8%AE%8A

http://ppt.cc/nIAF

http://www.google.com.tw/url?sa=t&rct=j&q=pwm&source=web&cd=10&cad=rja&ved=0CFMQFjAJ&url=http%3A%2F%2Fwww.vr.ncue.edu.tw%2Fesa%2Fa1001%2FPWM.pdf&ei=S3OoUO6pOafcmAWWiIGQDw&usg=AFQjCNE_7pw6paGQzH7kSwkwD2witqcC-A

http://hi.baidu.com/snic_k/item/0f045e3288e6683d2e20c42b

陈志旺(2012)。STM32 嵌入式微控制器快速上手。中國:电子工业出版社。