1. 程式人生 > >STM32一個Timer輸出4路不同頻率、可調佔空比的PWM

STM32一個Timer輸出4路不同頻率、可調佔空比的PWM

main.c

  1. /********************************************* 
  2.     標題:操作USART的練習 
  3.     軟體平臺:MDK-ARM Standard Version4.70 
  4.     硬體平臺:stm32f4-discovery   
  5.     主頻:168M 
  6.     Periph_Driver_version: V1.0.0 
  7.     描述:用一個定時器(TIM3),實現四路不同頻率、佔空比可調的PWM 
  8.           程式碼參考自STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
     
  9.     author:大舟 
  10.     data:2013-04-13 
  11. **********************************************/
  12. #include "stm32f4_discovery.h"
  13. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
  14. TIM_OCInitTypeDef  TIM_OCInitStructure;  
  15. __IO uint16_t CCR1_Val = 5000;//54618
  16. __IO uint16_t CCR2_Val = 27309;  
  17. __IO uint16_t CCR3_Val = 13654;  
  18. __IO uint16_t CCR4_Val = 6826;  
  19. uint16_t PrescalerValue = 0;  
  20. void TIM_Config(void);  
  21. int main(void)  
  22. {  
  23.   /*!< At this stage the microcontroller clock setting is already configured,  
  24.        this is done through SystemInit() function which is called from startup 
  25.        file (startup_stm32f4xx.s) before to branch to application main.
     
  26.        To reconfigure the default setting of SystemInit() function, refer to 
  27.        system_stm32f4xx.c file 
  28.      */
  29.   /* TIM Configuration */
  30.   TIM_Config();  
  31.   /** ----------------------------------------------------------------------- 
  32.     TIM3 Configuration: Output Compare Timing Mode: 
  33.     In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),  
  34.     since APB1 prescaler is different from 1.    
  35.       TIM3CLK = 2 * PCLK1   
  36.       PCLK1 = HCLK / 4  
  37.       => TIM3CLK = HCLK / 2 = SystemCoreClock /2 
  38.     To get TIM3 counter clock at 500 KHz, the prescaler is computed as follows: 
  39.        Prescaler = (TIM3CLK / TIM3 counter clock) - 1 
  40.        Prescaler = ((SystemCoreClock /2) /50 MHz) - 1 
  41.     CC1 update rate = TIM3 counter clock / CCR1_Val = 9.154 Hz  @note 上面已經將CCR1_Val改為了5000,具體頻率,見中斷的註釋 
  42.     ==> Toggling frequency = 4.57 Hz 
  43.     C2 update rate = TIM3 counter clock / CCR2_Val = 18.31 Hz 
  44.     ==> Toggling frequency = 9.15 Hz 
  45.     CC3 update rate = TIM3 counter clock / CCR3_Val = 36.62 Hz 
  46.     ==> Toggling frequency = 18.31 Hz 
  47.     CC4 update rate = TIM3 counter clock / CCR4_Val = 73.25 Hz 
  48.     ==> Toggling frequency = 36.62 Hz 
  49.     Note:  
  50.      SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. 
  51.      Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() 
  52.      function to update SystemCoreClock variable value. Otherwise, any configuration 
  53.      based on this variable will be incorrect.     
  54.   ----------------------------------------------------------------------- */
  55.   /* Compute the prescaler value */
  56.   PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 500000) - 1;//=168
  57.   /* Time base configuration */
  58.   TIM_TimeBaseStructure.TIM_Period = 65535;//65535
  59.   TIM_TimeBaseStructure.TIM_Prescaler = 0;  
  60.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  61.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  62.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
  63.   /* Prescaler configuration */
  64.   TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);//對84M進行168分頻,即為500KHz
  65.   /* Output Compare Timing Mode configuration: Channel1 */
  66.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;  
  67.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  68.   TIM_OCInitStructure.TIM_Pulse = CCR1_Val;  
  69.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
  70.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
  71.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);  
  72.   /* Output Compare Timing Mode configuration: Channel2 */
  73.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  74.   TIM_OCInitStructure.TIM_Pulse = CCR2_Val;  
  75.   TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
  76.   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);  
  77.   /* Output Compare Timing Mode configuration: Channel3 */
  78.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  79.   TIM_OCInitStructure.TIM_Pulse = CCR3_Val;  
  80.   TIM_OC3Init(TIM3, &TIM_OCInitStructure);  
  81.   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);  
  82.   /* Output Compare Timing Mode configuration: Channel4 */
  83.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  84.   TIM_OCInitStructure.TIM_Pulse = CCR4_Val;  
  85.   TIM_OC4Init(TIM3, &TIM_OCInitStructure);  
  86.   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);  
  87.   /* TIM Interrupts enable */
  88.   TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);  
  89.   /* TIM3 enable counter */
  90.   TIM_Cmd(TIM3, ENABLE);  
  91.   while (1);  
  92. }  
  93. /** 
  94.   * @brief  Configure the TIM IRQ Handler. 
  95.   * @param  None 
  96.   * @retval None 
  97.   */
  98. void TIM_Config(void)  
  99. {  
  100.   NVIC_InitTypeDef NVIC_InitStructure;  
  101.   /* TIM3 clock enable */
  102.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
  103.   /* Enable the TIM3 gloabal Interrupt */
  104.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
  105.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  106.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  107.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  108.   NVIC_Init(&NVIC_InitStructure);  
  109.   /* Initialize Leds mounted on STM32F4-Discovery board */
  110.   STM_EVAL_LEDInit(LED4);  
  111.   STM_EVAL_LEDInit(LED3);  
  112.   STM_EVAL_LEDInit(LED5);  
  113.   STM_EVAL_LEDInit(LED6);  
  114.   /* Turn on LED4, LED3, LED5 and LED6 */
  115.   STM_EVAL_LEDOn(LED4);  
  116.   STM_EVAL_LEDOn(LED3);  
  117.   STM_EVAL_LEDOn(LED5);  
  118.   STM_EVAL_LEDOn(LED6);  
  119. }  
  120. #ifdef  USE_FULL_ASSERT
  121. /** 
  122.   * @brief  Reports the name of the source file and the source line number 
  123.   *         where the assert_param error has occurred. 
  124.   * @param  file: pointer to the source file name 
  125.   * @param  line: assert_param error line source number 
  126.   * @retval None 
  127.   */
  128. void assert_failed(uint8_t* file, uint32_t line)  
  129. {  
  130.   /* User can add his own implementation to report the file name and line number, 
  131.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  132.   while (1)  
  133.   {}  
  134. }  
  135. #endif
  136. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/


stm32f4xx_it.c

  1. #include "stm32f4xx_it.h"
  2. #include "stm32f4_discovery.h"
  3. uint16_t capture = 0;  
  4. extern __IO uint16_t CCR1_Val;  
  5. extern __IO uint16_t CCR2_Val;  
  6. extern __IO uint16_t CCR3_Val;  
  7. extern __IO uint16_t CCR4_Val;  
  8. /** 
  9. 實際上當CCR1_Val每次都變化時,就可以用來改變佔空比 
  10. */
  11. void TIM3_IRQHandler(void)  
  12. {  
  13.     /*7500為一個迴圈,週期為7500/500000=0.015,頻率為66.67Hz*/
  14.     if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)  
  15.     {  
  16.         TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);  
  17.         if(CCR1_Val==5000)  
  18.         {  
  19.             STM_EVAL_LEDOn(LED4);   //PD12=0。ARR增加5000後,到達這條語句。
  20.             CCR1_Val=2500;          //所以低電平的百分比為5000/7500=2/3。即佔空比為1/3
  21.         }  
  22.         else
  23.         {  
  24.             STM_EVAL_LEDOff(LED4);  //PD12=1
  25.             CCR1_Val=5000;  
  26.         }  
  27.         capture = TIM_GetCapture1(TIM3);  
  28.         TIM_SetCompare1(TIM3, capture + CCR1_Val);//在原來的CCR1(即capture)基礎上加5000,則再過5000,又會觸發中斷
  29.         //另外,有個問題,進入中斷時,當ARR計數器快加到65535,而又不足5000時,不是會有資料多餘,而產生波形的移動嗎?
  30. 相關推薦

    STM32一個Timer輸出4不同頻率調PWM

    main.c /*********************************************      標題:操作USART的練習      軟體平臺:MDK-ARM Standard Version4.70      硬體平臺:stm32f4-d

    STM32 自定義頻率PWM輸出的方法

    圖一 圖二 PWM應用非常廣泛,但是不同的專案對輸出的PWM又有特殊要求,為滿足這些要求我們需要更多的實驗來驗證。接下來講述圖一顯示波形的輸出方法步驟(圖二為異常波形)。 一、本例項所使用資源: 1、TIM4_CH3(對應管腳PB8)用於輸出PWM波形 2、TIM3用於

    stm32 學習 (設定TIM4輸出4 pwm J-LINK模擬驗證)

    使用微控制器:stm32f103c8t6  資源 RAM: 20K; flash: 64K;CPU頻率: 72M;通用I/O: 32個;UART: 3個;SPI:2個;USB:1個;CAN: 1個;IIC: 2個 12 位同步 ADC: 2 組 10 通道 ; 

    stm32 學習 (設定TIM4輸出4 pwm J-LINK模擬驗證)

    使用微控制器:stm32f103c8t6  資源 RAM: 20K; flash: 64K;CPU頻率: 72M;通用I/O: 32個;UART: 3個;SPI:2個;USB:1個;CAN: 1個;IIC: 2個 12 位同步 ADC: 2 組 10 通道 ;     

    STM32基礎知識2-分享PWM輸入模式捕捉4PWM波形的週期和

    前幾天分享過一個帖子,因為網速原因沒有上傳原始碼,看到有人回覆我說實驗不成功,那麼好吧!這是我的錯誤,這次就將原始碼和我的心得體會分享出來,供大家下載測試和成長。我其實也是菜鳥一個,如果講解的地方有啥不對,或是程式設計的不好,歡迎大家提出意見,讓我們一起來學習進步。ffic

    stm32pwm頻率設定

    對於72M頻率來說,計算pwm頻率是: 頻率: //Fpwm = 72M / ((arr+1)*(psc+1))(單位:Hz) 佔空比: //duty circle = TIM3->CCR1 / arr(單位:%) 這樣每次改變頻率和佔空比都要手動算一下,非常

    STM32 CubeMX輸入捕獲測量PWM波形頻率

    使用的開發板是官方的STM32F412ZGTx NUCLEO開發板。本次主要是為了對PWM波形進行脈寬和頻率的測量。很多的工程使用的是軟體對同一個通道進行3次捕獲,比較耗費系統資源,本次介紹使用硬體進行捕獲,儘可能降低程式碼的工作量。首先開啟CubeMX,做如下設定:1.先設

    STM32 PWM和訊號週期的控制因素分析

    前言 博文基於STM32F103ZET6晶片,標準韌體庫3.5.0和MDK5編寫; 博文並不討論PWM的基礎知識,而是直接去談對PWM靈活的控制問題;想全面瞭解的可以看看我寫的專門針對PWM的部落格: https://blog.csdn.net/wuyuzun/arti

    51微控制器按鍵控制輸出pwm

    之前說到利用51微控制器輸出pwm,但是輸出的pwm是固定佔空比的,如果想要改變佔空比,還得回過頭來修改程式並重新燒寫進微控制器。這樣做的話不但麻煩、效率低,還又把晶片的可燒寫次數減少了一次,雖然51的晶片現在很便宜,但能省點就省點,能不浪費就不浪費,哈哈,開玩笑啦!最主要的

    【 MATLAB 】使用 MATLAB 比較不同的週期方波的 DFS 圖

    週期方波的表示式我就不提煉了,既然你來看文章了,我就不信你週期方波都不知道。 佔空比定義為:L/N,N為週期,下面我們對 L = 5,N = 20; L = 5,N = 40;L = 5,N = 60

    簡單淺談 電魚機的脈寬頻率

    高頻魚機後級的脈寬,頻率,佔空比,以上三個引數很重要。它不僅是設計魚機的主要引數,而且也是輸出效果調整的最終目標。 根據本人長時間玩高頻機的一點點經驗現向大家淺談一下脈寬,頻率,佔空比與之高頻魚機的設計與最終輸出效果的兩者密切關係。…………首先說一下魚機的設計。在談及設計高頻魚機之前,先說一下脈衝電

    微控制器測量方波的頻率及相位差的方法

    1、  頻率及佔空比的測量      如上圖所示,當脈衝的上升沿來臨時,將定時器開啟;緊接著的下降沿來臨時,讀取定時器的值,假設定時時間為t1;下一個上升沿來臨時關閉定時器,讀取定時器的值,假設定時時間為t2。t1即為1個週期內高電平的時間,t2即為脈衝的週期。t1/t2

    PWM頻率的關係

    1秒內,0.5秒開,0.5秒滅,佔空比是50%對吧?那麼,1毫秒內,0.5毫秒開,0.5毫秒滅,佔空比也是50%,對吧?如果是1秒呢,頻率就是1HZ,如果是1毫秒,頻率就是1KHZ,顯然,同樣是50%佔空比,如果頻率是1HZ,那電機肯定是跳著走的,燈光肯定閃得可以跳舞,不具有

    STM32F429--STM32PWM產生與測量

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

    STM32F302CB使用HAL庫採集PWM頻率

    微控制器執行在36MHz,以TIM2CH2為輸入通道,做如下配置: /* TIM2 init function 由CubeMX生成,定時器初始化*/ void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef

    STM32定時器輸出PWM頻率和步進電機控制速度計算

    內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12 1、STM32F4系列定時器輸出PWM頻率計算 第一步,了解定時器的時鐘多少:   我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。 (1)高級定時器timer1, time

    習慣4一個盒子兩條

    你應該會記得我講過的一個盒子兩條路的概念,就是說你在說英語的時候,你必須能夠從自己心目中的畫面和感覺直接走到英語。你聽英語的時候,你是直接到自己的畫面和感覺,不需要經過種中文的翻譯。那這個是怎麼的練出來?是一個非常關鍵的問題。今天講的習慣就是叫你一步一步把這個習慣練的很好。首先。你是要在中文裡邊

    輸入一個int型整數,將其逆序輸出,每個數字後有一個空格。 將n按其逆序輸出,每個數字後有一個空格,輸出一行。例如,輸入12354,輸出4 5 3 2 1

    #include<stdio.h>#include<math.h> int main(){ int n,a; scanf("%d",&n); while(1) { if(n>=10)  {  a=n%10;  n=n/10;  print

    STM32 使用DMA+DAC+TIMER 輸出正弦波

    之前已經簡單論述過,根據我個人菜鳥的瞭解與認識,對之前的知識進行整理回顧: DMA:我的理解就是一個通道,或者是一座橋樑。在靜態記憶體到靜態記憶體,或者外設到靜態記憶體間的一個通訊的通道。建立這個通道的好處是:可以拋開CPU,不佔用CPU的資源,直接使用這塊記憶體的內容

    Log4j按級別輸出日誌到不同文件配置

    tails lin file true nds 配置文件 http strong 自定義 1、自定義LogFileAppender類,繼承DailyRollingFileAppender,實現Log4j按級別輸出日誌到不同文件。 package com.liying.