welcom ! Handel home

顯示具有 PWM of STM32 M3 標籤的文章。 顯示所有文章
顯示具有 PWM of STM32 M3 標籤的文章。 顯示所有文章

2014年6月24日 星期二

ST32 PWM demo2

include "stm32f10x.h"
BitAction  bbt=0;  //定義一個位變數 bbt,並清0
u16          i;

int main(void){
 u16 InitValue,Pre_Divide,ZKB;
 SystemInit(); //系統時鐘初始化,調用該函數後,系統時鐘為72M,函數原形在system_stm32f10x.c
 GPIO_init();

//****TIM1_PWM1通道設置******************************************
 InitValue=7200;          //初值1000
 Pre_Divide=1;            //預分頻1
 ZKB=1200;                 //占空比

 TIM1_PWM_1_init(InitValue,Pre_Divide,ZKB);
 TIM1->CCR1=2400;   //修改占空比
//*************************************************************************//

while(1)
 {          //
 }

}

//這是sysinit.c  系統程式
#include "stm32f10x.h"
void GPIO_init()
{
 GPIO_InitTypeDef GPIO_InitStructure;              //聲明埠結構,需要放在前面
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); 
// 開啟相對應的clock source Port A  and PortB

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//**************A8,A9,A10TIM1_PWM波的輸出端***************************
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //PWM波設為複用推挽輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //埠頻率可設為21050  
 GPIO_Init(GPIOA, &GPIO_InitStructure);   //啟動A 



//*************B13,B14,B15TIM1_PWM波的互補輸出端**********************
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //埠頻率可設為21050
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //PWM波的複用推挽輸出
 GPIO_Init(GPIOB,&GPIO_InitStructure);               //啟動B
}

//***TIM1_PWM 1通道初始化******************************************
void TIM1_PWM_1_init(u16 InitValue, u16 Pre_Divide, u16 CCR1_Val){

 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef        TIM_OCInitStructure;
 TIM_BDTRInitTypeDef      TIM_BDTRInitStructure; 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
 TIM_TimeBaseStructure.TIM_Period =InitValue;
 TIM_TimeBaseStructure.TIM_Prescaler =Pre_Divide-1;
 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
 TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 TIM_ARRPreloadConfig(TIM1,ENABLE);   //使能TIM1ARR上的預裝載寄存器 

 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;// 選擇計時器模式 TI脈衝寬度調製模式
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //選擇輸出比較狀
 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//選擇互補輸出比較狀態
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //選擇輸出極性
 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//選擇互補輸出極性 
 TIM_OCInitStructure.TIM_Pulse = CCR1_Val;     //設置待裝入捕獲比較寄存器的脈衝值
 TIM_OC1Init(TIM1, &TIM_OCInitStructure);//捕獲比較匹配器結構1通道賦值
 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1CCR1上的預裝載寄存器

//死區設置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable
//TIM1_OSSRState設置在運行模式下非工作狀態選項
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
//TIM1_OSSIState設置在空閒模式下非工作狀態選項(使能TIM1 OSSI狀態

TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
 //TIM1_LOCKLevel設置了鎖電平參數(不鎖任何位

TIM_BDTRInitStructure.TIM_DeadTime = 0x90;
//這裡調整死區大小0-0xff,TIM1_DeadTIM1指定了輸出打開和關閉狀態之間的延時 

TIM_BDTRInitStructure.TIM_Break=TIM_Break_Disable;
//TIM1_Break使能或者失能TIM1刹車輸入(失能TIM1刹車輸入
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
//TIM1_BreakPolarity設置TIM1刹車輸入管腳極性(TIM1刹車輸入管腳極性高) 
TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
//TIM1_AutomaticOutput使能或者失能自動輸出功能(自動輸出功能使能)
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
//(設置刹車特性,死區時間,鎖電平,OSSIOSSR狀態和AOE(自動輸出使能)
TIM_Cmd(TIM1, ENABLE);         //使能或者失能指定的   
TIM_CtrlPWMOutputs(TIM1, ENABLE);  //使能或者失能TIM1外設的主輸出

}

st32 PWM概述

PWM概述 
PWMPulse Width Modulation的縮寫,中文意思就是脈衝寬度調製,簡稱脈寬調製。它是利用微處理器的數位輸出來對類比電路進行控制的一種非常有效的技術,其控制簡單、靈活和動態回應好等優點而成為電力電子技術最廣泛應用的控制方式,其應用領域包括測量,通信,功率控制與變換,電動機控制、伺服控制、調光、開關電源,甚至某些音訊放大器,因此研究基於PWM技術的正負脈寬數控調製信號發生器具有十分重要的現實意義。 
PWM是一種對類比信號電平進行數位編碼的方法。通過高解析度計數器的使用,方波的占空比被調製用來對一個具體類比信號的電平進行編碼。PWM信號仍然是數位的,因為在給定的任何時刻,滿幅值的直流供電要麼完全有(ON),要麼完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重複脈衝序列被加到類比負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要頻寬足夠,任何模擬值都可以使用PWM進行編碼。 
多數負載(無論是電感性負載還是電容性負載)需要的調製頻率高10Hz,通常調製頻率為1kHz200kHz之間。占空比是接通時間與週期之比;調製頻率為週期的倒數。 
目前,運動控制系統或電動機控制系統中實現PWM的方法主要有傳統的數位電路方式、專用的PWM積體電路、單片機實現方式和可程式設計邏輯器件實現方式。用傳統的數位電路實現PWM,電路設計較複雜,體積大,抗干擾能力差,系統的控制週期較長。專用的PWM積體電路或帶有PWM的單片機價格較高。對於單片機中無PWM輸出功能的情況,實現PWM將消耗大量的時間,大大降低了CPU的效率,而且得到的PWM信號精度不太高
PWM 模式  
脈衝寬度調製模式可以產生一個由 TIM1_ARR寄存器確定頻率、由 TIM1_CCRx寄存器確定占空比的信號。在 TIM1_CCMRx寄存器中的 OCxM位寫入“110”(PWM模式 1)或“111”(PWM模式 2),能夠獨立地設置每個通道工作在 PWM模式,每個 OCx輸出一路PWM。必須通過設置 TIM1_CCMRx寄存器 OCxPE位使能相應的預裝載寄存器,最後還要設置 TIM1_CR1寄存器的 ARPE位使能自動重裝載的預裝載寄存器(在向上計數或中心對稱模式中)   
因為僅當發生一個更新事件的時候,預裝載寄存器才能被傳送到影子寄存器,因此在計數器開始計數之前,必須通過設置 TIM1_EGR寄存器中的 UG位來初始化所有的寄存器。   
OCx的極性可以通過軟體在 TIM1_CCER寄存器中的 CCxP位設置,它可以設置為高電平有效活和低電平有效。OCx輸出通過 CCxECCxNEMOEOSSIOSSR( TIM1_CCER TIM1_BDTR寄存器中)的組合控制。 
 PWM模式(模式 1或模式 2)下,TIM1_CNT TIM1_CCRx始終在進行比較,(依據計數器的計數方向)以確定是否符合 TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。根據 TIM1_CR1寄存器中 CMS位元的狀態,計時器能夠產生邊沿對齊的或中央對齊的 PWM信號。 PWM 邊沿對齊模式  · 向上計數配置  
TIM1_CR1寄存器中的DIR位為低的時候執行向上計數。   
TIM1_CNTPWM參考信號,OCxREF為高,否則為低。如果TIM1_CCRx中的比較值大於自動重裝載值(TIM1_ARR),則OCxREF保持為“1"。如果比較值為 0,則OCxREF保持為“0"。 3-1TIM1_ARR=8時邊沿對齊的PWM波形實例。



<> 
向下計數的配置  
TIM1_CR1寄存器的DIR位為高時執行向下計數。   
 PWM模式 1,當 TIM1_CNT>TIM1_CCRx時參考信號 OCxREF為低,否則為高。如果 TIM1_CCRx中的比較值大於 TIM1_ARR中的自動重裝載值,則OCxREF保持為“1"。
該模式下不能產生 0%的 PWM波形。  PWM 中央對齊模式  
TIM1_CR1寄存器中的CMS位不為 00時為中央對齊模式(所有其他的配置對OCxREF/OCx信號都有相同的作用)。根據不同的CMS位元的設置,比較標誌可能在計數器向上計數時被置 1、在計數器向下計數時被置 1、或在計數器向上和向下計數時被置 1TIM1_CR1寄存器中的計數方向位元(DIR)由硬體更新,不要用軟體修改它。  
 3-2給出了一些中央對齊的PWM波形的例子    · TIM1_ARR=8    · PWM模式 1  
  · TIM1_CR1 寄存器中的 CMS=01,在中央對齊模式 1 時,當計數器向下計數時標誌被設置。
<> 

3.1.2  互補輸出與死區插入  
高級控制計時器 TIM1能夠輸出兩路互補信號並且能夠管理輸出的暫態關斷和接通。這段時間通常被稱為死區,應該根據連接到輸出的器件和它們的特性(電平轉換的延時、電源開關的延時等)來調整死區時間。   
配置 TIM1_CCER寄存器中的 CCxP CCxNP位,可以為每一個輸出獨立地選擇極性(主輸出 OCx或互補輸出 OCxN)。互補信號OCxOCxN通過下列控制位元的組合進行控制:TIM1_CCER寄存器的CCxECCxNE位,TIM1_BDTRTIM1_CR2寄存器中的MOEOISxOISxNOSSIOSSR位,帶刹車功能的互補輸出通道OCxOCxN的控制位。特別的是,在轉換到IDLE狀態時(MOS下降到 0)死區被
啟動。   
同時設置 CCxE CCxNE位將插入死區,如果存在刹車電路,則還要設置 MOE位。每一個通道都有一個 10位元的死區發生器。參考信號 OCxREF可以產生 2路輸出 OCx OCxN。如果 OCx OCxN為高有效:  
      · OCx 輸出信號與參考信號相同,只是它的上升沿相對於參考信號的上升沿有一個延遲。  
      · OCxN 輸出信號與參考信號相反,只是它的上升沿相對於參考信號的下降沿有一個延遲。 
如果延遲大於當前有效的輸出寬度(OCxOCxN),則不會產生相應的脈衝。  3-3,3-4顯示了死區發生器的輸出信號和當前參考信號 OCxREF之間的關係(假設 CCxP=0CCxNP=0MOE=1CCxE=1並且 CCxNE=1)  



.2  PWM輸出的實現[12] 
    STM32的高級計時器時鐘TIM1CLK為固定72MHz, TIM1 預分頻為 0x0(系統高速時鐘不分頻)所以TIM1計數器時鐘頻率為72MHzI/O口時鐘為固定值50MHzPA8PA9PA10PA11設為推拉模式。 TIM1 在下面定義的頻率下工作:  
 TIM1 頻率= TIM1CLK/(TIM1_Period + 1) = 17.57 KHz  
TIM1 CC1 寄存器的值為0x7FFF, 所以 TIM1_CH1   TIM1_CH1N  產生一個頻率為 17.57KHz的信號,這個信號的占空比為:  
 TIM1_CH1 占空比 = TIM1_CCR1 /(TIM1_Period + 1) = 50%  
TIM1 CC2 寄存器的值為 0x3FFF,  所以 TIM1_CH2   TIM1_CH2N  產生一個 17.57KHz 的信號,它的占空比為:  
TIM1_CH2 占空比 = TIM1_CCR2 / (TIM1_Period + 1)= 25% 
TIM1 CC3 寄存器的值為 0x1FFF,  所以 TIM1_CH3  TIM1_CH3N 產生一個 17.57KHz 的信號,它的占空比為:  
TIM1_CH3 占空比 = TIM1_CCR3 / (TIM1_Period + 1) = 12.5% TIM1  波形可以在示波器上顯示出來。  輸出信號觀察 
 下列引腳分別依次接到示波器上(兩個一組),示波器接線正接觸線下列引腳,負接觸線接地(GND)。 
·  TIM1_CH1 pin (PA8)      
·  TIM1_CH1N pin (PB13)     
 ·  TIM1_CH2 pin (PA9)     
 ·  TIM1_CH2N pin (PB14)  

·  TIM1_CH3 pin (PA10)    
 ·  TIM1_CH3N pin (PB15)     
 ·  TIM1_CH4 pin (PA11)