stm32pwm输出 占空比100%的时候频率会跳动

◇本站云标签
◇热点推荐STM32 PWM - 世事洞明皆学问
- 博客频道 - CSDN.NET
转自:http://blog.csdn.net/dazhaozi/article/details/6868414
由于没有专门的引脚,所以使用口的复用模式,通用定时器每个可以产生路()。
一:首先,配置为复用模式,如下图:(截图自:STM32中文参考手册)
例如开启TIM3的通道,查表知该通道关联的是口,所以,配置为输出,并设置它为复用输出。
GPIOA-&CRL&=0X0FFFFFFF;//PA7输出
GPIOA-&CRL|=0XB0000000;//复用功能输出
如何选择开启每个定时器中的路呢?这就用到捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx&_CCMR1和TIMx&_CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR1控制CH3和4。该寄存器如图(下排为输入模式):
这里要用到的是模式设置位(12-14、4-6位)OCxM,此部分由3位组成。总共可以配置成7种模式,若要使用PWM模式,则将这3位设置为110/111。这两种PWM模式的区别就是输出电平的极性相反,即高电平或低电平时间所占总周期的比例,110为高电平时间所占总周期比例;
还有使能位11位、3位,置1预装载使能CH2和CH1。
预装载使能打开并未真正打开PWM通道,还有两个开关,一个是单通道使能—TIMx_CCER寄存器,一个是TIMx开关TIMx_CRx。
TIMx_CCER寄存器控制CH1—CH4输入输出通道的开关,只需设置对应的CCxE位为1即可将PWM信号输出到对应的输出引脚。&该寄存器如下图:
TIMx_CRx寄存器需要打开该寄存器自动重装载预装载允许位ARPE&(第7位)。注:个人认为不对该寄存器操作也可。
二:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率。
这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。
三:TIMx_CCRx寄存器,确定PWM的占空比。
TIMx_CCR1—TIMx_CCR4确定定时器的CH1—CH4四路PWM的占空比。直接给该寄存器赋0—6;即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0—100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。
TIMx_CCRx寄存器如下图所示:
STM32&PWM输出函数(举例)
void&PWM_Init(u16&arr,u16&psc)
RCC-&APB1ENR|=1&&1;&&&&&&&//TIM3时钟使能&&&&
GPIOA-&CRL&=0X0FFFFFFF;//PA7输出
GPIOA-&CRL|=0XB0000000;//复用功能输出&模式&&
TIM3-&ARR=//设定计数器自动重装值&
TIM3-&PSC=//预分频器不分频
TIM3-&CCMR1|=6&&12;&&//CH2&PWM2模式(高电平为占空比)&&
TIM3-&CCMR1|=1&&11;&//CH2预装载使能&&&&
TIM3-&CCER|=1&&4;&&&//OC2&输出使能&&&&
TIM3-&CR1=0x8000;&&&//ARPE使能&
TIM3-&CR1|=0x01;&&&&//使能定时器&&&
新手上路,如有错误,欢迎指正。
转自:http://blog.csdn.net/akunainiannian/article/details/
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。
四、给出了PWM频率和占空比的计算公式。
步骤如下:
1、使能TIM3时钟
RCC-&APB1ENR |= 1 && 1;
2、配置对应引脚(PA6)的复用输出功能
GPIOA-&CRL &= 0XF0FFFFFF;//PA6清0
GPIOA-&CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA-&ODR |= 1 && 6;//PA6上拉
3、设定计数器自动重装值及是否分频
TIM3-&ARR =//设定计数器自动重装值(决定PWM的频率)
&TIM3-&PSC =//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
//TIM3-&CCMR1 |=&6 && 4;//CH1 PWM1模式&
TIM3-&CCMR1 |= 7 && 4;//CH1 PWM2模式&
&TIM3-&CCMR1 |= 1 && 3;//CH1预装载使能
5、输出使能设置
TIM3-&CCER& |= 1 && 0;//输入/捕获1输出使能
6、自动重装载预装载允许位(ARPE) 及 定时器&使能
TIM3-&CR1 = 0X0080;//ARPE使能(此句不配置也行)
TIM3-&CR1 |= 0X01;//使能定时器3
下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:
void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
&&&&//1、使能TIM3时钟&&&
&&& RCC-&APB1ENR |= 1 && 1;//使能TIM3时钟
&&&&//2、配置对应引脚(PA6)的复用输出功能
&&& GPIOA-&CRL &= 0XF0FFFFFF;//PA6清0
&&& GPIOA-&CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
&&& GPIOA-&ODR |= 1 && 6;//PA6上拉&&&
&&&&//3、设定计数器自动重装值及是否分频
&&& TIM3-&ARR =//设定计数器自动重装值(决定PWM的频率)
&&& TIM3-&PSC =//预分频器 0为不分频
&&&&//4、设置PWM的模式
&&& TIM3-&CCMR1 |= 7 && 4;//CH1 PWM2模式&
&&& TIM3-&CCMR1 |= 1 && 3;//CH1预装载使能&&&&
&&&&//5、输出使能设置
&&& TIM3-&CCER& |= 1 && 0;//输入/捕获1输出使能
&&&&//6、自动重装载预装载允许位(ARPE) 及 定时器&使能
&&& TIM3-&CR1 = 0X0080;//ARPE使能
&& &TIM3-&CR1 |= 0X01;//使能定时器3
void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
&& &RCC-&APB1ENR |= 1 && 1;//使能TIM3时钟
&&& GPIOA-&CRL &= 0X0FFFFFFF;//PA7清0
&&& GPIOA-&CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
&& &GPIOA-&ODR |= 1 && 7;//PA7上拉
&& &TIM3-&ARR =//设定计数器自动重装值(决定PWM的频率)
&& &TIM3-&PSC =//预分频器 不分频
&& &TIM3-&CCMR1 |= 7 && 12;//CH2 PWM2模式
&&& TIM3-&CCMR1 |= 1 && 11;//CH2预装载使能
&& &TIM3-&CCER& |= 1 && 4;//输入/捕获2输出使能
&& &TIM3-&CR1 = 0X0080;//ARPE使能
&&& TIM3-&CR1 |= 0X01;//使能定时器3
//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
//duty circle = TIM3-&CCR1 / arr(单位:%)
注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53395次
积分:1183
积分:1183
排名:第17613名
原创:46篇
转载:112篇
(3)(11)(8)(4)(6)(9)(7)(1)(5)(5)(3)(4)(2)(5)(9)(2)(3)(16)(54)(3)STM32PWM产生30K以上的频率就不行了,大家给看看程序!!(已解决) - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 1192|回复: 3
STM32PWM产生30K以上的频率就不行了,大家给看看程序!!(已解决)
主题帖子积分
新手上路, 积分 5, 距离下一级还需 45 积分
新手上路, 积分 5, 距离下一级还需 45 积分
void TIM4_PWM_init(CHn ch, u32 freq, u32 duty)
TIM_TimeBaseInitTypeDef
TIM4_TimeBaseS//?¨?? 1/2 á????
TIM_OCInitTypeDef
TIM4_OCInitS
GPIO_InitTypeDef GPIO_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);//????GPIOD 1/4 °????,???IO?±??
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//????TIM4?±??
//GPIOA?????????¨?±AE÷4u?PWM4,??¨u?,???????????
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //,????AE?ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//I/O?±????50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure);//,ù 3/4 ????ae?,?¨??????? 1/4 >>?GPIO 1/2 á????
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); // 1/2 <<TIM4?? 1/2 ??ê?<<??????
//?¨?±AE÷>>ù± 3/4 ????
TIM4_TimeBaseStructure.TIM_Period =(u16)(/freq-1);// 1/4 AE???u??1000
TIM4_TimeBaseStructure.TIM_Prescaler = 2-1;//2·?AEu
TIM4_TimeBaseStructure.TIM_ClockDivision = 0;//???ù·?AEu0
TIM4_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//?ò?? 1/4 AE??
TIM_TimeBaseInit(TIM4, &TIM4_TimeBaseStructure);
TIM4_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//?¨?±AE÷??????PWM1??? 1/2
TIM4_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H//TIM????±? 1/2 ? 1/4 <<??,ss
// PWM1??? 1/2 ?¨u?1
TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_E//?¨u?1????????
TIM4_OCInitStructure.TIM_Pulse =(u16)(/freq/PWM_precision*duty);//???í?u??200
TIM_OC1Init(TIM4,&TIM4_OCInitStructure); //,ù 3/4 ?TIM_OCInitStruct???,?¨u???????? 1/4 >>?TIM2
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //????TIM2??CCR1??u??¤×°?? 1/4 ??aeAE÷
// PWM1??? 1/2 ?¨u?2
if (ch==2)
TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM4_OCInitStructure.TIM_Pulse =(u16)(/freq/PWM_precision*duty);//???í?u?
TIM_OC2Init(TIM4, &TIM4_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//????TIM2??CCR2??u??¤×°?? 1/4 ??aeAE÷
// PWM1??? 1/2 ?¨u?3
if (ch==3)
TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM4_OCInitStructure.TIM_Pulse =(u16)(/freq/PWM_precision*duty);
TIM_OC3Init(TIM4, &TIM4_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
// PWM1??? 1/2 ?¨u?4
if (ch==4)
TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM4_OCInitStructure.TIM_Pulse =(u16)(/freq/PWM_precision*duty);
TIM_OC4Init(TIM4, &TIM4_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);//????TIM2??ARR??u??¤×°?? 1/4 ??aeAE÷
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4);//?¤???????ù???????>>
/* ????????±? 1/2 ??¨u?1????*/
TIM_ITConfig(TIM4,TIM_IT_CC1,DISABLE);
TIM_Cmd(TIM4, ENABLE);//?????¨?±AE÷2
主题帖子积分
新手上路, 积分 2069, 距离下一级还需 -2019 积分
新手上路, 积分 2069, 距离下一级还需 -2019 积分
RE:STM32PWM产生30K以上的频率就不行了,大家给看看程序!!
产生30K以上的波不行是什么意思?
下面是我产生38KHz,占空比为1/3的程序,你可以看看
void TIM1_Configuration(void)
& & & & TIM_TimeBaseInitTypeDef TIM_TimeBaseS & & & && &&&//?? 3/4 ?±???·???×????ae
& & & & TIM_OCInitTypeDef TIM_OCInitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
& & & & TIM_TimeBaseStructure.TIM_Period = 1894;
& & & & TIM_TimeBaseStructure.TIM_Prescaler = 0;
& & & & TIM_TimeBaseStructure.TIM_ClockDivision = 0;
& && &&&TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
& & & & TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
&&/* PWM1 Mode configuration: Channel1 */
& & & & TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
& & & & TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
& & & & TIM_OCInitStructure.TIM_Pulse = 1894/3;& & & &
& & & & TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
& & & & TIM_OC1Init(TIM1, &TIM_OCInitStructure);
& & & & TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
& & & & TIM_ARRPreloadConfig(TIM1, ENABLE);
&&/* TIM1 enable counter */
& & & & TIM_Cmd(TIM1, DISABLE);&&
& & & & TIM_CtrlPWMOutputs(TIM1, ENABLE);
主题帖子积分
新手上路, 积分 2069, 距离下一级还需 -2019 积分
新手上路, 积分 2069, 距离下一级还需 -2019 积分
RE:STM32PWM产生30K以上的频率就不行了,大家给看看程序!!
产生30K以上的波不行是什么意思?
下面是我产生38KHz,占空比为1/3的程序,你可以看看
void TIM1_Configuration(void)
& & & & TIM_TimeBaseInitTypeDef TIM_TimeBaseS & & & && &&&//?? 3/4 ?±???·???×????ae
& & & & TIM_OCInitTypeDef TIM_OCInitS
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
& & & & TIM_TimeBaseStructure.TIM_Period = 1894;
& & & & TIM_TimeBaseStructure.TIM_Prescaler = 0;
& & & & TIM_TimeBaseStructure.TIM_ClockDivision = 0;
& && &&&TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
& & & & TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
&&/* PWM1 Mode configuration: Channel1 */
& & & & TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
& & & & TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
& & & & TIM_OCInitStructure.TIM_Pulse = 1894/3;& & & &
& & & & TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
& & & & TIM_OC1Init(TIM1, &TIM_OCInitStructure);
& & & & TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
& & & & TIM_ARRPreloadConfig(TIM1, ENABLE);
&&/* TIM1 enable counter */
& & & & TIM_Cmd(TIM1, DISABLE);&&
& & & & TIM_CtrlPWMOutputs(TIM1, ENABLE);
主题帖子积分
论坛元老, 积分 3476, 距离下一级还需 9996523 积分
论坛元老, 积分 3476, 距离下一级还需 9996523 积分
回复:STM32PWM产生30K以上的频率就不行了,大家给看看程序!!
看你的代码好费劲,发一个我的吧,默认50KHZ,可以随意设置频率和占空比,楼主可以参考一下:这个代码已经验证:
unsigned char Pwm_
unsigned char Pwm_duty_num =20 ; // 50kHZ
extern volatile unsigned short int
Pwm_period_
unsigned short int
unsigned short int
//unsigned short int
CCR3_Val = 50;
//unsigned short int
CCR4_Val = 20;
/*******************************************************************************
* 函数名称: Timer3_PWM_Init();
* 功能描述: 定时器3初始化--用于产生四路PWM
* 输入参数: void
* 返回参数: 无
********************************************************************************/
void Timer3_PWM_Init(void)
GPIO_InitTypeDef GPIO_InitS
TIM_TimeBaseInitTypeDef
TIM_TimeBaseInitS
TIM_OCInitTypeDef
TIM_OCInitS
CCR1_Val = (unsigned short int)(50*(Pwm_period_num+1)/100);
CCR2_Val = (unsigned short int)(50*(Pwm_period_num+1)/100);
//时钟配置
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE , ENABLE);
// 使能GPIOB端口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 打开定时器3的时钟
//TIM3-CH1-CH4GPIO通道配置--PE2-PE5
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd =
GPIO_PuPd_UP ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_PinAFConfig(F303C_PWM3_CH1_P0RT ,
F303C_PWM3_CH1_SOURCE,
F303C_PWM3_CH1_AF);
GPIO_PinAFConfig(F303C_PWM3_CH2_P0RT ,
F303C_PWM3_CH2_SOURCE,
F303C_PWM3_CH2_AF);
GPIO_PinAFConfig(F303C_PWM3_CH3_P0RT ,
F303C_PWM3_CH3_SOURCE,
F303C_PWM3_CH3_AF);
GPIO_PinAFConfig(F303C_PWM3_CH4_P0RT ,
F303C_PWM3_CH4_SOURCE , F303C_PWM3_CH4_AF);
//设置定时器相关参数
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
// 定时器时钟分频后:
/ (72 + 1) = 1MHZ.
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_Period = Pwm_period_
// 自动重装载计数器周期的值--默认50KHZ
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
// 时钟分频系数--不分频
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
// TIM2, 每1ms中断一次.
//PWM模式设置-CH3
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
TIM_OCInitStructure.TIM_Pulse = CCR1_V
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
//PWM模式设置-CH4
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR2_V
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
Tel: 3-8056
备案号: 苏ICP备号-2
Powered byPWM_Input STM32定时器PWM输入捕获,利用TIM1计算脉冲频率及占空比。 Other Embeded program 其他嵌入式/单片机内容 225万源代码下载-
&文件名称: PWM_Input& & [
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 8 KB
&&上传时间:
&&下载次数: 763
&&提 供 者:
&详细说明:STM32定时器PWM输入捕获,利用TIM1计算脉冲频率及占空比。-This example shows how to use the TIM peripheral to measure the frequency and duty cycle of an external signal.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&PWM_Input\main.c&&.........\readme.txt&&.........\stm32f10x_conf.h&&.........\stm32f10x_it.c&&.........\stm32f10x_it.h&&PWM_Input
&[]:和说明完全不符&[]:很好,推荐下载&[]:和说明完全不符&[]:纯粹是垃圾&[]:和说明完全不符&[]:纯粹是垃圾&[]:和说明完全不符&[]:纯粹是垃圾&[]:文件不全&[]:很好,推荐下载
&近期下载过的用户:
&&&&&&&&&&&&&&&&&&&&&[]
&相关搜索:
&&&&&&&&&&
&输入关键字,在本站225万海量源码库中尽情搜索:
我们制作的频率测量计, 合理利用单片机的各项性能, 对被测信号、标准信号进行脉冲计数。本产品能信号频率进行精确测量。
产品的产生, 将极大程度上突出价格便宜, 取材方便、就地, 电路简易的广泛适用特点, 值得推广!
&[] - stm32定时器的基本应用,PWM的输入捕获,硬件调试通过,基本没有误差。
&[] - 飞思卡尔的PWM程序 学习交流 给初学者看的
&[] - 一份stm32处理器上定时器TIM1应用编程的实际例子,附送一份详细pdf源代码说明,说明很清楚,参考价值很大
&[] - stm32的PWM详细例程,能够使用的,下载完了要给点回复哦!
&[] - stm32 audio codec examples
&[] - stm32 单片机产生32768Hz的方波 其中有定时器的配置
&[] - stm32的固件库汉化更新,包括flash、USART、IAP等等应用程序注释已经汉化……
&[] - stm32中断nvic的一点心得,关于中断的优先级,和寄存器配置
&[] - stm32 中断通讯的实例stm32 中断通讯的实例STM32PWM配置 - 好代码编程网
STM32PWM配置
一:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率。
这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。
二:TIMx_CCRx寄存器,确定PWM的占空比。
TIMx_CCR1&TIMx_CCR4确定定时器的CH1&CH4四路PWM的占空比。直接给该寄存器赋0&65535值即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0&100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。
.Net 文章一周点击
.Net 文章一月点击
HaoGongJu.Net ( 好代码 ) All Rights Reserved

我要回帖

更多关于 stm32pwm输入模式 的文章

 

随机推荐