日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F103 16路PWM 配置

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F103 16路PWM 配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

底層庫:基于原子的標準庫函數
適用芯片:STM32F103系列型號芯片,其他型號未測試(注:已測型號:C8T6、CBT6、RCT6、RET6、ZET6)
所用到的定時器:TIM1、TIM2、TIM3、TIM4
所用的IO口:TIM1:PA8 PA9 PA10 PA11;TIM2:PA0 PA1 PA2 PA3 ;TIM3:PA6 PA7 PB0 PB1 TIM4:PB6 PB7 PB8 PB9
輸出:16路PWM,占空比0-100可調,頻率1KHz

2. TIM PWM對應IO配置表

3. TIM1 PWM配置

**注意!!! 高級定時器必須加上在初始化末尾加上:TIM_CtrlPWMOutputs(TIM1, ENABLE);

//TIM1 PWM部分初始化 //PWM輸出初始化 //arr:自動重裝值 //psc:時鐘預分頻數 void TIM1_PWM_Init(uint16_t arr,uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時器3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //IO 復用//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //TIM1的部分重映射,加這句,并修改IO配置 //GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //TIM1的完全重映射,加這句,并修改IO配置//沒有重映射時,TIM1的四個通道CH1,CH2,CH3,CH4分別對應 PA8 PA9 PA10 PA11//部分重映射時,TIM1的四個通道CH1,CH2,CH3,CH4分別對應 PA8 PA9 PA10 PA11//完全重映射時,TIM1的四個通道CH1,CH2,CH3,CH4分別對應 PE7 PE9 PE11 PE13GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//初始化TIM1TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_OCInitStructure.TIM_Pulse = 0; //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2Init(TIM1, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC4Init(TIM1, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_Cmd(TIM1, ENABLE); //使能TIM3TIM_CtrlPWMOutputs(TIM1, ENABLE); //高級定時器必須使能 pwm輸出TIM_SetCompare1(TIM1,0); //占空比 = 0 / TIM_Period * 100% TIM_SetCompare2(TIM1,0);TIM_SetCompare3(TIM1,0);TIM_SetCompare4(TIM1,0); }

4. TIM2 PWM配置

//TIM2 PWM部分初始化 //PWM輸出初始化 //arr:自動重裝值 占空比 = 0 / TIM_Period * 100% //psc:時鐘預分頻數 void TIM2_PWM_Init(uint16_t arr,uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定時器3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //IO 復用//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //TIM2的部分重映射 1,加這句,并修改IO配置 //GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); //TIM2的部分重映射 2,加這句,并修改IO配置 //GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //TIM2的完全重映射 ,加這句,并修改IO配置 //沒有重映射,TIM2的四個通道CH1,CH2,CH3,CH4分別對應 PA0 PA1 PA2 PA3//部分重映射 1,TIM2的四個通道CH1,CH2,CH3,CH4分別對應 PA15 PB3 PA2 PA3//部分重映射 2,TIM2的四個通道CH1,CH2,CH3,CH4分別對應 PA0 PA1 PB10 PB11//完全重映射,TIM2的四個通道CH1,CH2,CH3,CH4分別對應 PA15 PB3 PB10 PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//初始化TIM1TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高TIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC4Init(TIM2, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_Cmd(TIM2, ENABLE); //使能TIM2TIM_SetCompare1(TIM2,0); //占空比 = 0 / TIM_Period * 100% TIM_SetCompare2(TIM2,0);TIM_SetCompare3(TIM2,0);TIM_SetCompare4(TIM2,0); }

5. TIM3 PWM配置

//TIM3 PWM部分初始化 //PWM輸出初始化 //arr:自動重裝值 //psc:時鐘預分頻數 void TIM3_PWM_Init(uint16_t arr,uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //IO 復用//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //TIM3的部分重映射,加這句,并修改IO配置 //GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //TIM3的完全重映射,加這句,并修改IO配置//當沒有重映射時,TIM3的四個通道CH1,CH2,CH3,CH4分別對應 PA6 PA7 PB0 PB1//當部分重映射時,TIM3的四個通道CH1,CH2,CH3,CH4分別對應 PB4 PB5 PB0 PB1//當完全重映射時,TIM3的四個通道CH1,CH2,CH3,CH4分別對應 PC6 PC7 PC8 PC9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO//初始化TIM3TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_OCInitStructure.TIM_Pulse = 0; //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_Cmd(TIM3, ENABLE); //使能TIM3TIM_SetCompare1(TIM3,0); //占空比 = 0 / TIM_Period * 100% TIM_SetCompare2(TIM3,0);TIM_SetCompare3(TIM3,0);TIM_SetCompare4(TIM3,0);

6. TIM4 PWM配置

//TIM4 PWM部分初始化 //PWM輸出初始化 //arr:自動重裝值 //psc:時鐘預分頻數 void TIM4_PWM_Init(uint16_t arr,uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定時器3時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //IO 復用//GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //TIM4的完全重映射,加這句,并修改IO配置//當沒有重映射時,TIM4的四個通道CH1,CH2,CH3,CH4分別對應 PB6 PB7 PB8 PB9//當完全重映射時,TIM4的四個通道CH1,CH2,CH3,CH4分別對應 PD12 PD13 PD14 PD15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO//初始化TIM4TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_OCInitStructure.TIM_Pulse = 0; //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高TIM_OC1Init(TIM4, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載寄存器TIM_OC3Init(TIM4, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC4Init(TIM4, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_Cmd(TIM4, ENABLE); //使能TIM3TIM_SetCompare1(TIM4,0); //占空比 = 0 / TIM_Period * 100% TIM_SetCompare2(TIM4,0);TIM_SetCompare3(TIM4,0);TIM_SetCompare4(TIM4,0);

初始化參數

TIM1_PWM_Init(100-1,720-1); //PWM頻率=72M/(100*720)=1Khz TIM2_PWM_Init(100-1,720-1); //PWM頻率=72M/(100*720)=1Khz TIM3_PWM_Init(100-1,720-1); //PWM頻率=72M/(100*720)=1Khz TIM4_PWM_Init(100-1,720-1); //PWM頻率=72M/(100*720)=1Khz

7. 總結

1—TIM1為高級定時器,初始化時需要加上:TIM_CtrlPWMOutputs(TIM1, ENABLE);
2—TIM2部分重映射有兩組
3—TIM4不區分部分和完全重映射,統為重映射,重映射配置時參數為GPIO_Remap_TIM4
4—在PWM輸出頻率為1KHz時,對于大部分隔離芯片會有意想不到的優勢

總結

以上是生活随笔為你收集整理的STM32F103 16路PWM 配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。