1. 程式人生 > >STM32產生SPWM

STM32產生SPWM

/** @author Mei Jilin
    @date   2013/9/2
    @brief  加入生成SPWM部分
**/
#include "timer.h"
#include "led.h"
static uint16_t CCR3_Val = 1800;
static uint16_t PrescalerValue = 0;

/*PWM輸出配置說明,*/
/* - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 選擇TIMER工作在36MHZ

    The TIM3 is running at 36 MHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)
                                                  = 36 MHz / 3600 = 10 KHz
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 */
	/*轉換週期10K*/
void PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseStructure;
	TIM_OCInitTypeDef        	TIM_OCInitStructure;
	GPIO_InitTypeDef 			GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;    
	 	/* TIM3 clock enable */
   	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  	/* GPIOA and GPIOB clock enable */
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
                         	 RCC_APB2Periph_AFIO, ENABLE);
  	/* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;      //TIM1_CH1N
    GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	 /* Compute the prescaler value */
  	PrescalerValue = (uint16_t) (SystemCoreClock / 36000000) - 1; //TIMER2 - 36MHZ
  	/* Time base configuration */
  	TIM_TimeBaseStructure.TIM_Period = 3600;	 				/*TIM3_ARR = 2879,12.5Khz*/
  	TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    /* Channel 1, 2,3 and 4 Configuration in PWM mode */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //關閉互補輸出
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    
  	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //這句的功能是讓改變CCR2之後馬上有效    
	TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);    
        
  	TIM_Cmd(TIM1, ENABLE);	
    /* TIM1 Main Output Enable */
    TIM_CtrlPWMOutputs(TIM1, ENABLE);   //TIM1需要加上這句,貌似低階定時器不需要
}
uint16_t Duty[] = {1800,1856,1912,1968,2023,2078,2131,2183,2233,2282,2329,2373,2416,2456,2493,
    2528,2559,2588,2614,2636,2655,2671,2684,2692,2698,2699,2698,2692,2684,2671,2655,2636,2614,
    2588,2559,2528,2493,2456,2416,2373,2329,2282,2233,2183,2131,2078,2023,1968,1912,1856,1800,
    1743,1687,1631,1576,1521,1468,1416,1366,1317,1270,1226,1183,1143,1106,1071,1040,1011,985,
    963,944,928,915,907,901,900,901,907,915,928,944,963,985,1011,1040,1071,1106,1143,1183,1226,
    1270,1317,1366,1416,1468,1521,1576,1631,1687,1743,1799,1799};
uint16_t count = 0;
uint16_t num = sizeof(Duty)/(sizeof(Duty[0]));
void TIM1_CC_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  {
    TIM1->SR = (uint16_t)~TIM_IT_CC1;
    TIM1->CCR1 = Duty[count];
    count++;
    if(count==num)
    {
        count=0;
    }
  }
}
下一篇文章中會簡單講解一下Duty[]是如何產生的連結:http://blog.csdn.net/mjlsuccess/article/details/11020219

相關推薦

STM32產生SPWM

SPWM釋義 SPWM(Sinusoidal PWM)法是一種比較成熟的,目前使用較廣泛的PWM法。前面提到的取樣控制理論中的一個重要結論:衝量相等而形狀不同的窄脈衝加在具有慣性的環節上時,其效果基本相同。SPWM法就是以該結論為理論基礎,用脈衝寬度按正弦規律變化而和正弦波等效的PWM波形

STM32產生SPWM

/** @author Mei Jilin @date 2013/9/2 @brief 加入生成SPWM部分 **/ #include "timer.h" #include "led.h" static uint16_t CCR3_Val = 1800

如何計算產生SPWM所需要的佔空比

在上一篇文章裡貼上了STM32產生SPWM的程式碼,我在編寫這些程式碼時最大的問題就是如何得到佔空比,就是程式碼中的陣列 Duty[]。他的思想就是對正弦波取樣,在取樣點出用PWM的佔空比來代替正弦波在該點的數值。最容易想到就是用定時器的ARR值乘以sin(2*pi*f*t

利用28335的epwm產生spwm波的總結

一、SPWM設計簡介 設計的內容是產生倍頻的SPWM波,也即是用的是同一個調製波,兩個橋臂上的載波相差180度。產生spwm時,利用TB產生載波,也即是三角波。(計數方式採用增減模式即可),CC中放的是要比較的數值,當TB中的值等於CC中的值就可產生相應的動作。此動作可由A

在keil中觀察STM32產生的PWM 用示波器觀察實質頻率與模擬不符 是計算值的10倍(疑惑中。。。)

 第一步:選擇軟體模擬 1.配置軟體模擬  第二步:進入模擬,呼叫logicc analyer 觀察波形 1.按模擬按鍵進入模擬介面 2.開啟模擬 示波器 介面 3.設定觀察埠  4.開始模

stm32高級定時器的應用——spwm

異步 影響 時鐘 技術分享 pwm nbsp http image 定時器 用過stm32定時器的朋友都知道,定時器的CCR寄存器,可以用來配置PWM的輸出,但同樣也可以用來配置spwm。廢話不多說,直接上代碼。   首先,你得考慮一下幾個因素:

STM32 定時器2 CH1 CH2 PWM輸出 產生呼吸燈效果

     PWM一般用來驅動電機(控制速度),控制LED亮度,驅動開關電源電路等等,本例項通過改變PWM佔空比的方式來驅動LED燈,形成呼吸燈的效果。用這種方式來學習STM32 TIM2輸出PWM的配置。      以STM32F103C8T6為例,從其資料手冊中可以看到,P

STM32STM32之timer3產生PWM

//****************************************************************************** //name: GUA_Timer3_PWM.c

利用MATLAB計算SPWM脈衝寬度與並應用STM32輸出

轉自 光電科技協會 王誠博 http://blog.csdn.net/wcb425499094/article/details/76703042 先上一張spwm波形生成原理圖: 首先利用MATLAB產生三角波與正弦波疊加: [cpp] view plain copy print? %%

STM32定時器產生PWM--呼吸燈

說明:本工程程式碼在STM32F407ZET6上測試通過。 1、PWM定義 Pulse Width Modulation:脈衝寬度調製(PWM) 2、用途 (1)控制輸出的電壓和電流 (2)燈光的亮度 (3)電機控制 3、分析PWM產生

STM32F429--STM32的PWM佔空比產生與測量

一、PWM波形的產生; 使用定時器2 (TIM2)PA5埠輸出。 通過配置 TIM_TimeBaseStructure.TIM_Period= 1000 - 1; TIM_TimeBaseStructure.TIM_Prescaler= 9000 - 1; TI

H橋SPWM產生電路及死區電路的分析

1、 H橋電路 H橋的工作原理如下,正半波時Q1,Q4導通,Q2,Q3截止;負半波時Q2,Q3導通,Q1,Q4截止。而且要保證Q3和Q4,Q1和Q2不能同時導通。即Q3與Q4,Q1與Q2要有死區,所謂

微控制器SPWM產生

電賽剛結束不久,期間我做的題目需要用單片產生一個三相的SPWM波,然後再通過硬體電路LC濾波形成正弦波。 我用的微控制器是STC15F2K60S2,然後通過自然數查表法控制內部3路PWM產生SPWM訊號,而且生成的正弦波相位是相差120°,並且頻率是50Hz。

python出現UnicodeEncodeError有可能產生的另一個原因

erro inux encode fault roo install 出現 div wrap 在使用python中,我們都有可能遇到如下的錯誤: UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in po

STM32的RFID射頻讀寫控制裝置

please include .cn mage str rfid alt all float ,大二上學期做的,過了很久,先上一下圖: 這並不是做個最後一版;主體是RC552+STM32+1062;蜂鳴器,繼電器,LED等;反正最後的效果就是,刷一下卡,1602顯示一下持

modelsim調用產生隨機數及創建虛擬類

iic blue 類型 div spa 窗口 查看 隨機數 lan 1、 Modelsim仿真產生隨機數 reg data; data = $random % a; //產生從-a+1 ~ a-1 的隨機數 data = {$random} % a; //產生從0

STM32的IO口

enum 都是 芯片 復用 一個 article 模擬 font 下拉 STM32 的 IO 口 能夠由軟件配置成例如以下 8 種模式: 1、輸入浮空 2、輸入上拉 3、輸入下拉 4、模擬輸入 5、開漏輸出 6、推挽輸出 7、推挽式復用功能 8、開漏復用功能 每一個

從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出範圍的值

mvc 異常 highlight ech 解決方案 har sqlserve 要去 轉化 最近在ASP.NET MVC中遇到一個問題,如題,在使用EF數據模型的時候,要去添加一條新的數據到Sqlserver數據庫,在之前項目中並沒有出現該異常,所以去扒了扒demo,發現有幾

SPI problem of STM32

cti program ram can ash fun amp read this There is a problem that data can not be read from the flash when I use SPI to operate W25Q6

js 解決由於&#65279(bom文件格式)產生的空白行

空白行 pan original inner itl nal 文件 head type 把以下代碼放到HTML頁面的head標簽裏就行了: <script>  var a=document.body.innerHTML;  document.body.inn