STM32一個Timer輸出4路不同頻率、可調佔空比的PWM
main.c
- /*********************************************
- 標題:操作USART的練習
- 軟體平臺:MDK-ARM Standard Version4.70
- 硬體平臺:stm32f4-discovery
- 主頻:168M
- Periph_Driver_version: V1.0.0
- 描述:用一個定時器(TIM3),實現四路不同頻率、佔空比可調的PWM
-
程式碼參考自STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
- author:大舟
- data:2013-04-13
- **********************************************/
- #include "stm32f4_discovery.h"
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- __IO uint16_t CCR1_Val = 5000;//54618
- __IO uint16_t CCR2_Val = 27309;
-
__IO uint16_t CCR3_Val = 13654;
- __IO uint16_t CCR4_Val = 6826;
- uint16_t PrescalerValue = 0;
- void TIM_Config(void);
- int main(void)
- {
- /*!< At this stage the microcontroller clock setting is already configured,
- this is done through SystemInit() function which is called from startup
-
file (startup_stm32f4xx.s) before to branch to application main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f4xx.c file
- */
- /* TIM Configuration */
- TIM_Config();
- /** -----------------------------------------------------------------------
- TIM3 Configuration: Output Compare Timing Mode:
- In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),
- since APB1 prescaler is different from 1.
- TIM3CLK = 2 * PCLK1
- PCLK1 = HCLK / 4
- => TIM3CLK = HCLK / 2 = SystemCoreClock /2
- To get TIM3 counter clock at 500 KHz, the prescaler is computed as follows:
- Prescaler = (TIM3CLK / TIM3 counter clock) - 1
- Prescaler = ((SystemCoreClock /2) /50 MHz) - 1
- CC1 update rate = TIM3 counter clock / CCR1_Val = 9.154 Hz @note 上面已經將CCR1_Val改為了5000,具體頻率,見中斷的註釋
- ==> Toggling frequency = 4.57 Hz
- C2 update rate = TIM3 counter clock / CCR2_Val = 18.31 Hz
- ==> Toggling frequency = 9.15 Hz
- CC3 update rate = TIM3 counter clock / CCR3_Val = 36.62 Hz
- ==> Toggling frequency = 18.31 Hz
- CC4 update rate = TIM3 counter clock / CCR4_Val = 73.25 Hz
- ==> Toggling frequency = 36.62 Hz
- Note:
- SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file.
- Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
- function to update SystemCoreClock variable value. Otherwise, any configuration
- based on this variable will be incorrect.
- ----------------------------------------------------------------------- */
- /* Compute the prescaler value */
- PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 500000) - 1;//=168
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period = 65535;//65535
- TIM_TimeBaseStructure.TIM_Prescaler = 0;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- /* Prescaler configuration */
- TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);//對84M進行168分頻,即為500KHz
- /* Output Compare Timing Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
- /* Output Compare Timing Mode configuration: Channel2 */
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
- TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
- /* Output Compare Timing Mode configuration: Channel3 */
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
- TIM_OC3Init(TIM3, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
- /* Output Compare Timing Mode configuration: Channel4 */
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
- TIM_OC4Init(TIM3, &TIM_OCInitStructure);
- TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
- /* TIM Interrupts enable */
- TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
- /* TIM3 enable counter */
- TIM_Cmd(TIM3, ENABLE);
- while (1);
- }
- /**
- * @brief Configure the TIM IRQ Handler.
- * @param None
- * @retval None
- */
- void TIM_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* TIM3 clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- /* Enable the TIM3 gloabal Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- /* Initialize Leds mounted on STM32F4-Discovery board */
- STM_EVAL_LEDInit(LED4);
- STM_EVAL_LEDInit(LED3);
- STM_EVAL_LEDInit(LED5);
- STM_EVAL_LEDInit(LED6);
- /* Turn on LED4, LED3, LED5 and LED6 */
- STM_EVAL_LEDOn(LED4);
- STM_EVAL_LEDOn(LED3);
- STM_EVAL_LEDOn(LED5);
- STM_EVAL_LEDOn(LED6);
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- while (1)
- {}
- }
- #endif
- /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
stm32f4xx_it.c
- #include "stm32f4xx_it.h"
- #include "stm32f4_discovery.h"
- uint16_t capture = 0;
- extern __IO uint16_t CCR1_Val;
- extern __IO uint16_t CCR2_Val;
- extern __IO uint16_t CCR3_Val;
- extern __IO uint16_t CCR4_Val;
- /**
- 實際上當CCR1_Val每次都變化時,就可以用來改變佔空比
- */
- void TIM3_IRQHandler(void)
- {
- /*7500為一個迴圈,週期為7500/500000=0.015,頻率為66.67Hz*/
- if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
- if(CCR1_Val==5000)
- {
- STM_EVAL_LEDOn(LED4); //PD12=0。ARR增加5000後,到達這條語句。
- CCR1_Val=2500; //所以低電平的百分比為5000/7500=2/3。即佔空比為1/3
- }
- else
- {
- STM_EVAL_LEDOff(LED4); //PD12=1
- CCR1_Val=5000;
- }
- capture = TIM_GetCapture1(TIM3);
- TIM_SetCompare1(TIM3, capture + CCR1_Val);//在原來的CCR1(即capture)基礎上加5000,則再過5000,又會觸發中斷
- //另外,有個問題,進入中斷時,當ARR計數器快加到65535,而又不足5000時,不是會有資料多餘,而產生波形的移動嗎?
-
相關推薦
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輸入模式捕捉4路PWM波形的週期和佔空比
前幾天分享過一個帖子,因為網速原因沒有上傳原始碼,看到有人回覆我說實驗不成功,那麼好吧!這是我的錯誤,這次就將原始碼和我的心得體會分享出來,供大家下載測試和成長。我其實也是菜鳥一個,如果講解的地方有啥不對,或是程式設計的不好,歡迎大家提出意見,讓我們一起來學習進步。ffic
stm32中pwm頻率和佔空比設定
對於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--STM32的PWM佔空比產生與測量
一、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.