您的位置 首页 解答

STM32单片机学习—PWM输出

上午花了半天时间熟悉了stm32的PWM模块。中午利用午饭时间把PWM功能调试成功。当然,很简单的东西,也许很多前辈估计都不屑一顾的东西。今

上午花了半响时间了解了stm32的PWM模块。正午使用午饭时间把PWM功用调试成功。当然,很简单的东西,或许许多长辈估量都嗤之以鼻的东西。

今日最大的感叹便是网络资源实在是个巨大的宝库,真的很幸亏,在这个杂乱的社会环境里,在一个处处充满着私心、私益的年代,各个网站,各个论坛上的很多网友都时间保持着开源的气氛。学习必定要和别人沟通,而网络供给了这么一个极好的渠道。

废话少说,言归正传。

完成功用:选用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运转。

首要了解一下定时器的PWM相关部分。看图最理解

其实PWM便是定时器的一个比较功用罢了。

CNT里的值不断++,一旦加到与CCRX寄存器值持平,那么就发生相应的动作。这点和AVR单片机很相似。已然这样,咱们要发生需求的PWM信号,就需求设定PWM的频率和PWM的占空比。

首要说频率的确认。由于通用定时器的时钟来历是PCLK1,而我又喜爱用固件库的默许设置,那么定时器的时钟频率就这样来确认了,如下:

AHB(72MHz)→APB1分频器(默许2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。

这儿为什么是这样,在RCC模块学习记载里有具体记载,不多说。

因而图中的CK_PSC便是72MHz了。

下面的材料也是网上一搜一大把,我就罗列了:

STM32的PWM输出有两种形式,形式1(PWM1)和形式2(PWM2),由TIMx_CCMRx寄存器中的OCxM位确认的(“110”为形式1,“111”为形式2)。形式1和形式2的差异如下:

110:PWM形式1-在向上计数时,一旦TIMx_CNT=TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有用电平(OC1REF=1)。

111:PWM形式2-在向上计数时,一旦TIMx_CNT=TIMx_CCR1时通道1为有用电平,否则为无效电平。

由此看来,形式1和形式2正好互补,互为相反,所以在运用起来不同也并不太大。我用的是形式一,因而后边的设定都是依照形式一来设定的。

PWM的周期是便是由定时器的主动重装值和CNT计数频率决议的。而CNT的计数时钟是CK_PSC经分频器PSC得到,因而CNT的时钟便是CK_PSC/分频系数。这个分频系数在TIM_TimeBaseStructure.TIM_Prescaler确认。我设置的值是72,因而CNT的计数频率也便是CK_CNT的频率为1MHz。

下一步便是确认定时器主动重装值。由于CNT每自加到ARR寄存器的值时就会主动清零,当然条件是设定为为向上计数形式,而便是依据这个溢出事情来改动PWM的周期。所以PWM信号的频率由ARR的值来确认。我设置的值是1000-1,即TIM_TimeBaseStructure.TIM_Period = 1000-1;因而PWM的周期是1MHz/1000=1KHz。

接下来就要确认PWM的占空比了。由于CNT在自加到ARR值的进程中会不断和CRRX的值相比较,一旦二者持平就发生匹配事情,但要留意CNT不会理睬这件事,它会持续++直到等于ARR。而CRRX的值我设定为400-1,那么占空比就随之确认为40%。

好了,下面便是库函数的装备了。

TIMER输出PWM完成过程

1.设置RCC时钟;

2.设置GPIO;

3.设置TIMx定时器的相关寄存器;

4.设置TIMx定时器的PWM相关寄存器。

首要是main函数和全局变量声明,很简单,不作阐明

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TimOCInitStructure;

int main(void)
{

rcc_cfg();
gpio_cfg();
tim2_cfg();
pwm_cfg();
//
while (1)
{

GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);

delay();


GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);

delay();
}
}

下面是IO口的装备:

void gpio_cfg()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

此处要留意的是PWM输出口要装备为复用推挽输出,原因我也不知道,横竖照搬便是了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/257058.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部