STM32-PWM输出总结讲课讲稿
STM32之PWM
配置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的频率或占空比的准确性。
STM32输出不同频率PWM
STM32一定时器产生不同频率的PWM(转载)2011-05-05 12:07平时记性实在太差,调试完的程序,过两天又忘了,往往需要一阵子才能想起来,有时以前的资料找不到了,更是恼火,不得不重复到网上搜索。
刚刚调试成功了一个类型的程序,立刻记下来,呵呵,不要又忘记了。
STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生!当然,简单的设置对于新手来产,也是麻烦的,主要包括:(1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);(2)定义相应的GPIO:/* PA2,3,4,5,6输出->Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_ Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉接地,检测输入的高电平GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度GPIO_Init(GPIOA, &GPIO_InitStructure);/* PA7用于发出PWM波,即无线数据传送 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度GPIO_Init(GPIOA, &GPIO_InitStructure);(3)如果是产生PWM(频率不变,占空比可变),记得打开PWM控制,在TIM_Configurat ion()中。
stm32pwm输出三角波原理
stm32pwm输出三角波原理
在STM32微控制器中,PWM 输出可以实现多种波形,包括方波、正弦波、三角波等。
其中,三角波是一种非常常见的波形,在很多应用场景中都有广泛的应用。
三角波是一种连续的、平滑的波形,其特点是从低电平逐渐升高到高电平,然后再逐渐降低到低电平,如同一个长长的三角形。
在STM32 中,输出三角波需要使用 PWM 模块和定时器,并对定时器的计数器进行配置。
具体来说,输出三角波的原理如下:
1. 配置定时器为向上计数模式,并设置一个合适的计数频率,例如 10 kHz。
2. 配置 PWM 输出通道为定时器输出比较功能,并选择合适的输出极性和时钟分频系数。
3. 在每次定时器计数器达到设定值时,PWM 输出通道会自动翻转输出电平,这将导致三角波的上升和下降。
4. 在每次计数器溢出时,需要重新设置计数器的初始值,以保证连续输出三角波。
5. 如果需要改变三角波的频率或幅值,可以通过改变定时器的计数频率或 PWM 输出通道的占空比来实现。
通过上述方法,可以在 STM32 微控制器中实现三角波的输出。
这种波形非常适合一些需要连续、平滑的变化的应用场景,例如音频信号发生器、电机驱动等。
STM32F103学习笔记(八)PWM输出
STM32F103学习笔记(八)PWM输出脉冲宽度调制(PWM),是对脉冲宽度的控制。
STM32 的定时器除了 TIM6 和 7。
其他的定时器都可以用来产生PWM 输出。
其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。
而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!本实验是利用TIM3 的通道2,把通道2 重映射到PB5,产生PWM 来控制 DS0 的亮度。
TIM3_CH2 默认是接在 PA7上面的,而我们的 DS0 接在 PB5 上面,可以通过重映射功能,把 TIM3_CH2映射到 PB5 上。
关于重映射,有一个TIM3的重映射表:每个通道都是映射到固定的GPIO口上。
下面是关于time.c文件:[csharp] view plain copy1.//TIM3 PWM 部分初始化2.//PWM 输出初始化3.//arr:自动重装值4.//psc:时钟预分频数5.void TIM3_PWM_Init(u16 arr,u16 psc)6.{7.GPIO_InitTypeDef GPIO_InitStructure;8.TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;9.TIM_OCInitTypeDef TIM_OCInitStructure;10.RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, EN ABLE); //①使能定时器 3 时钟11.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|12.RCC_APB2Periph_AFIO, ENABLE); //①使能 GPIO 和 AFIO 复用功能时钟13.GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENA BLE); //②重映射 TIM3_CH2->PB514.//设置该引脚为复用输出功能,输出 TIM3 CH2 的 PWM 脉冲波形 GPIOB.515.GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH 216.GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出17.GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;18.GPIO_Init(GPIOB, &GPIO_InitStructure); //①初始化 GPIO19.//初始化 TIM320.TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值21.TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值22.TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim23.TIM_TimeBaseStructure.TIM_CounterMode = TIM_Cou nterMode_Up; //TIM 向上计数模式24.TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③初始化 TIMx25.//初始化 TIM3 Channel2 PWM 模式26.TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_P WM2; //选择 PWM 模式 227.TIM_OCInitStructure.TIM_OutputState = TIM_OutputSt ate_Enable; //比较输出使能28.TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity _High; //输出极性高29.TIM_OC2Init(TIM3, &TIM_OCInitStructure); //④初始化外设 TIM3 OC230.TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器31.TIM_Cmd(TIM3, ENABLE); //⑤使能 TIM332.}主函数:[csharp] view plain copy1.int main(void)2.{3.u16 led0pwmval=0;4.u8 dir=1;5.delay_init(); //延时函数初始化6.NVIC_Configuration(); //设置 NVIC 中断分组 2:2 位抢占优先级, 2 位响应优先级7.uart_init(9600); //串口初始化波特率为 96008.LED_Init(); //LED 端口初始化9.TIM3_PWM_Init(899,0); //不分频,PWM 频率=72000/900=8Khz10.while(1)11.{12.delay_ms(10);13.if(dir)led0pwmval++;14.else led0pwmval--;15.if(led0pwmval>300)dir=0;16.if(led0pwmval==0)dir=1;17.TIM_SetCompare2(TIM3,led0pwmval);18.}19.}。
stm32的pwm输出及频率计算方法
stm32的pwm输出及频率计算方法
一、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 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL //PA6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
//TIM3->CCMR1 |= 6 TIM3->CCMR1 |= 7 TIM3->CCMR1 |= 1
5、输出使能设置
TIM3->CCER |= 1。
如何采用STM32单片机来产生PWM输出
如何采用STM32单片机来产生PWM输出1. TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width ModulaTIon”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
一般用来控制步进电机的速度等等。
STM32的定时器除了基本定时器TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。
1.1 PWM输出模式STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM 位确定的(“110”为模式1,“111”为模式2)。
模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。
由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。
而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节。
1.2 PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。
在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。
但是这些重映像的管脚也是由参考手册给出的。
比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,。
STM32Cube学习之七:PWM输出
STM32Cube学习之七:PWM输出假设已经安装好STM32CubeMX和STM32CubeF4支持包。
Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。
Step2. 在Pinout界面下配置TIM14的PWM输出,正好是LED0控制引脚。
Step3.在Clock Configuration界面配置使用内部16MHz时钟源,参数默认即可。
Step4.配置TIM14参数。
在configuration界面中点击TIM14按钮,可以进入参数配置界面。
在Parameter Settings页配置预分频系数为15,计数周期(自动加载值)为99,定时器溢出频率,即PWM的周期,就是16MHz/(15+1)/(99+1) = 10kHz。
之所以将极性设置为Low,是因为LED0点亮方式是低电平。
Step5.生成源代码。
点击生成源代码按钮。
在设置界面中输入工程名,保存路径,工程IDE类型,点OK即可。
生成代码完成后可直接打开工程。
弹出如下对话框时,如果已经安装了F4的支持包,则点击OK关闭。
如果没有安装,则点击界面中的/...链接,找到芯片的支持包,然后安装。
关闭后面的界面。
点击“是”,然后选择芯片型号。
可以在搜索框中输入关键字,加快选择速度。
Step6.添加功能代码。
在main函数中定义一个变量pwm_val用于控制PWM输出的占空比。
在while(1)之前使能PWM输出通道CH1。
在while(1)中不断改变PWM输出的占空比,控制LED0的亮度变化,实现一个呼吸灯的效果。
周期约为5秒。
要注意的是,配置的自动加载参数是99,而LED的发光亮度和PWM的占空比并不成正比,当占空比>50%之后,变化就很小了,因此在while(1)中,占空比的变化是范围是0~50。
特别说明:本例的Step4,配置的参数中,控制PWM周期的是预分频器和自动加载寄存器,分别配置了15和99。
STM32定时器PWM输出总结
STM32定时器PWM输出总结STM32是意法半导体(STMicroelectronics)公司推出的一系列32位微控制器(MCU)的产品,相较于传统的8位和16位MCU,STM32具有更强的处理能力和更多的外设资源。
其中,定时器是STM32系列MCU的重要外设之一,可以用于实现各种定时、计数和PWM输出等功能。
定时器是STM32系列MCU中一个非常重要的外设,可以提供一些基本的定时、计数和计时功能。
除了基本功能外,定时器还可以通过配置不同的工作模式、输入捕获和输出比较等功能来实现更多的应用。
在STM32中,每个定时器可以被划分为多个通道,每个通道可以配置为不同的工作模式。
其中,PWM输出功能通常使用定时器的输出比较模式来实现,通过配置不同的占空比来实现不同的PWM波形输出。
使用STM32定时器的PWM输出功能,一般需要进行以下步骤:1.选择合适的定时器和通道:在STM32系列MCU中,一般会有多个定时器可供选择,根据实际需求选择合适的定时器和通道。
2.配置定时器的工作模式:定时器的工作模式取决于具体的应用需求,可以选择定时模式、计数模式、输入捕获模式或者输出比较模式。
3.配置输出比较模式:输出比较模式是实现PWM输出的关键,通过配置不同的比较值和占空比来实现不同的PWM波形输出。
4.配置GPIO引脚:将定时器的输出引脚与GPIO引脚相连,实现PWM波形的输出。
使用STM32定时器的PWM输出功能,可以实现多种应用。
比如:-控制电机的转速和方向:通过调整PWM波形的占空比,可以控制电机的转速和方向。
-LED灯的亮度调节:通过调整PWM波形的占空比,可以实现LED灯的亮度调节。
-蜂鸣器的声音控制:通过调整PWM波形的频率,可以实现蜂鸣器的声音控制。
总结起来,STM32定时器的PWM输出功能是一种非常有用且灵活的功能,可以通过配置不同的定时器和通道,实现多种不同的应用。
通过控制输出比较模式和占空比,可以实现精确的PWM波形输出。
STM32的PWM精讲
第 2 章 STM32 处理器概述 STM32F103xx 增强型系列产品中内置了多达 3 个同步的标准定时器。每个定 时
器都有一个 16 位的自动加载递加/递减计数器、一个 16 位的预分频器和 4 个 独立的 通道,每个通道都可用于输入捕获、输出比较、PWM 和单脉冲模式输出, 在最大的 封装配置中可提供最多 12 个输入捕获、输出比较或 PWM 通道。它们还 能通过定时器 链接功能与高级控制定时器共同工作,提供同步或事件链接功能。
它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术其控制简单灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式其应用领域包括测量通信功率控制与变换电动机控制伺服控制调光开关电源甚至某些音频放大器因此研究基于pwm技术的正负脉宽数控调制信号发生器具有十分重要的现实意义
STM32 的 PWM 精讲
器中的计数器使能位(CEN)时,CK_CNT 才有效。(有关更多的计数器使能的 细节,请参见控制器的从模式描述)。
注:真正的计数器使能信号 CNT_EN 是在 CEN 后的一个时钟周期后被设置。 预分 频器描述 。
预分频器可以将计数器的时钟频率按 1 到 65536 之间的任意值分频。它是
STM32单片机--PWM输出
STM32单片机--PWM输出采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行上午花了半天时间熟悉了stm32的PWM模块。
中午利用午饭时间把PWM功能调试成功。
当然,很简单的东西,也许很多前辈估计都不屑一顾的东西。
今天最大的感叹就是网络资源实在是个巨大的宝库,真的很庆幸,在这个复杂的社会环境里,在一个到处充斥着私心、私利的时代,各个网站,各个论坛上的众多网友都时刻保持着开源的氛围。
学习一定要和他人交流,而网络提供了这么一个极好的平台。
废话少说,言归正传。
实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。
首先熟悉一下定时器的PWM相关部分。
看图最明白其实PWM就是定时器的一个比较功能而已。
CNT里的值不断++,一旦加到与CCRX寄存器值相等,那么就产生相应的动作。
这点和A VR 单片机很类似。
既然这样,我们要产生需要的PWM信号,就需要设定PWM的频率和PWM 的占空比。
首先说频率的确定。
由于通用定时器的时钟来源是PCLK1,而我又喜欢用固件库的默认设置,那么定时器的时钟频率就这样来确定了,如下:AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。
这里为什么是这样,在RCC模块学习记录里有详细记载,不多说。
因此图中的CK_PSC就是72MHz了。
下面的资料也是网上一搜一大把,我就罗列了:STM32的PWM输出有两种模式,模式1(PWM1)和模式2(PWM2),由TIMx_CCMRx。
stm32定时器pwm输出原理
定时器PWM输出原理基于脉冲宽度调制模式(PWM),这是一种利用微处理器的数字输出来对模拟电路进行控制的有效技术。
在PWM模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
当CNT小于CCRx 时,TIMx_CHx通道输出低电平;当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
因此,所谓脉冲宽度调制模式,就是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。
例如,假设预分频时钟CK_PSC为100MHz,需要产生周期为1ms,占空比为47.5%的PWM信号。
可以通过设置PSC = 99,ARR = 999,Duty = 47.5%,则CRR = 475来实现。
另外,定时器的每个通道都可以输出PWM信号,对于同一个定时器而言,它的多个通道共享同一个自动重载寄存器,因此可以输出占空比不同,但周期相同的PWM信号。
在实际使用中,我们通常需要配置定时器输出通道、设置比较值以及使能预装载寄存器等步骤。
例如,对于定时器1,它的每一个输出通道都是成对的,即TIM1_CH1N与TIM1_CH1两个一组,用于驱动上下两个功率管。
STM32学习笔记(5):通用定时器PWM输出
STM32学习笔记(5):通用定时器PWM输出1.TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
一般用来控制步进电机的速度等等。
STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。
1.1PWM输出模式STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。
模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。
而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。
1.2PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7定时器复用功能重映射”一节。
在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。
PWM详细讲解
1、理论知识PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。
但是如果要用51单片机的话,也是可以的,但是比较的麻烦。
此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。
大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
下面重点介绍用一个定时器的实现PWM的方法。
因为市面上的智能小车所采用的电机大多数为TT减速电机,通过反复的实验,此电机最佳的工作频率为1000HZ (太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM波,程序中只需作简单修改即可。
用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。
因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间间隔为0.01ms,,然后中断100次即为1ms。
在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000HZ),2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,当time<n时,让单片相应的I/O口输出低电平,此时占空比就为%n。
2、程序1,使单片机的I/O口输出固定频率的PWM波下面按上面的思路给出一个具体程序:/*******************************************************************/ /* 程序名:单片机输出固定频率的PWM波*//* 晶振:11.00592 MHz CPU型号:STC89C52 *//* 功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*//*****************************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit PWM1=P2^0;//接IN1 控制正转sbit PWM2=P2^1;//接IN2 控制反转uchar time;void main(){TMOD=0x01;//定时器0工作方式1TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msEA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1){}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}void tim0() interrupt 1{TR0=0;//赋初值时,关闭定时器TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msTR0=1;//打开定时器time++;if(time>=100) time=0;//1khzif(time<=20) PWM1=0;//点空比%80else PWM1=1;PWM2=0;}程序说明:1、关于频率的确定:对于11.0592M晶振, PWM输出频率为1KHZ,此时设定时器0.01ms 中断一次,时中断次数100次即为1KHZ( 0.01ms*100=1ms,即为1000HZ)此时,定时器计数器赋初值为TH0=FF,TL0=F7。
STM32 PWM输出总结
学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。
Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。
从名字就可以看得出来主要功能上的差异。
今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。
先大致说下通用和高级定时器的区别。
通用的可以输出四路pwm信号互不影响。
高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。
接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。
Pwm输出最基本的调节就是频率和占空比。
频率当然又和时钟信号扯上了关系。
高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。
APB1和APB2的区别就要在于时钟频率不同。
APB2最高频率允许72MH,而APB1最高频率为36MHZ。
这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。
在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。
设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。
我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。
STM32之PWM波形输出配置总结
STM32之PWM波形输出配置总结1.TIMER分类STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
其中系统嘀嗒定时器是前文中所描述的SysTick。
其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动,时钟由APB2的输出产生。
TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。
2.PWM波形产生的原理通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X 在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR 预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A 乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。
3.STM32产生PWM的配置方法1)配置GPIO口不是每一个IO引脚都可以直接使用于PWM输出,下面是定时器的引脚重映像,其实就是引脚的复用功能选择:表3-1 定时器1的引脚复用功能映像表3-2 定时器2的引脚复用功能映像表3-3 定时器3的引脚复用功能映像表3-4 定时器4的引脚复用功能映像根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对IO口操作代码:2)初始化定时器3)设置TIM3_CH2的PWM模式、使能TIM3的CH2输出4)使能定时器3经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。
基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解
基于寄存器操作的STM32高级定时器TIM1的四路PWM输出程序讲解经过一天的努力,终于把stm32tim1的四路pwm输出搞了出来,为了使大家快速的用起tim1,打算写这篇文档与大家分享。
Stm32tim1功能丰富。
由于PWM输出和TIM2之间只有很小的差别,我在网上找到了一些网友的程序,发现大多数程序都是基于库文件编写的,所以我无法深入了解TIM1的PWM 输出。
我认为一个想要充分利用芯片的合格程序员应该直接对寄存器进行操作,并充分了解计时器的操作过程,你可以对电影的结构有一定的了解。
高级控制定时器(tim1和tim8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、pwm、嵌入死区时间的互补pwm等)。
使用定时器预分频器和rcc时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器(TIM1和tim8)和通用定时器(timx)是完全独立的,它们不共享任何资源。
请读者仔细阅读一下信息:脉冲宽度调制模式可由timx生成。
ARR寄存器确定频率,该频率由timx确定。
ccrx寄存器确定占空比信号。
在timx中,ccmrx寄存器中的ocxm位被写入“110”(PWM模式1)或“111”(PWM模式2),这可以独立设置每个OCX输出通道以生成一个PWM。
必须设置timx。
ccmrx寄存器的ocxpe位启用相应的预加载寄存器。
最后,应设置timx。
CR1寄存器的ARPE位(在递增计数或中心对称模式下)使预加载的寄存器能够自动重新加载。
只有在发生更新事件时,预加载寄存器才能传输到卷影寄存器,因此必须在计数器开始计算EGR寄存器中的μg位之前设置timx,以初始化所有寄存器。
可通过软件在timx中检测OCX的极性。
CCER寄存器中的ccxp位已设置,可设置为高级有效或低级有效。
STM32 笔记通用定时器输出PWM
STM32学习笔记:通用定时器输出PWM分类:STM32学习笔记2014-03-18 19:31 687人阅读评论(0) 收藏举报stm32通用定时器PWM输出脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度、电机转速等。
STM32 的定时器除了TIM6 和7,其他的定时器都可以用来产生PWM 输出。
其中高级定时器TIM1和TIM8可以同时产生高达7路的PWM输出,通用定时器TIM2~TIM5可以同时产生4路PWM输出。
使用通用定时器输出PWM同样需要4步配置,由于输出PWM信号时,不需要定时器中断,所以不需要配置NVIC,但是需要配置TIM_OCInitStructure。
下面已配置TIM2为例:(1)开启系统时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);(2)配置GPIOGPIO_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);(3)配置TIMERTIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = 3599; //重装载值3600TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数0,意味着不分频,由两项参数可算出定时器频率为20KHzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);(4)配置TIM_OCInitStructurevoid TIM2_PWM_Init(void){TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出模式为PWM1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高,即输出高电平TIM_OCInitStructure.TIM_Pulse =40*36; //设置PWM占空比为40%TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化TIM2信道1TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//开启TIM2信道1的预装载寄存器TIM_OCInitStructure.TIM_Pulse =0*36;TIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse =90*36;TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse =0*36;TIM_OC4Init(TIM2, &TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);}结构体TIM_OCInitTypeDef的定义为:typedef struct{uint16_t TIM_OCMode;uint16_t TIM_OutputState;uint16_t TIM_OutputNState;uint16_t TIM_Pulse;uint16_t TIM_OCPolarity;uint16_t TIM_OCNPolarity;uint16_t TIM_OCIdleState;uint16_t TIM_OCNIdleState;} TIM_OCInitTypeDef;其中TIM_OCPolarity、TIM_OCMode、TIM_OutputState、TIM_Pulse四个属性是需要我们设置的,其他四个属性是高级定时器TIM1和TIM8才有用的,在这里不做介绍。
STM32产生PWM精讲
TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//设置了待装入捕获比较器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出极性
{
Cnt[i]= 0;
T[i] = 0;
R[i] = 0;
Rh[i] = 0;
Rl[i] = 0;
F[i] = 0;
}
//t的范围为(0~65536)
T[0] = 450;//F=40K
T[1] = 600;//F=30K
T[2] = 900;//F=20K
T[3] = 1800; //F=10K
//F(占空比)的范围为(0~100)
unsigned int Rl[4];//模拟的PWM低电平比较寄存器
unsigned char F[4];//占空比数组
unsigned int CCR1,CCR2,CCR3,CCR4;
void Init(void)
{
unsigned char i = 0;
for(i = 0; i < 4; i++)
TIM_BaseInitStructure.TIM_Prescaler=3; //设置TIM时钟频率除数的预分频值(18M)
TIM_BaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择计数器模式
TIM_BaseInitStructure.TIM_Period=1800;//设置下一个更新事件装入活动的自动重装载寄存器周期的值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。
Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。
从名字就可以看得出来主要功能上的差异。
今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。
先大致说下通用和高级定时器的区别。
通用的可以输出四路pwm信号互不影响。
高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。
接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。
Pwm输出最基本的调节就是频率和占空比。
频率当然又和时钟信号扯上了关系。
高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。
APB1和APB2的区别就要在于时钟频率不同。
APB2最高频率允许72MH,而APB1最高频率为36MHZ。
这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。
在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。
设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。
我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。
定时器接下来还有一个分频寄存器:TIMX_PSC 经过他的分频后,才是定时器计数的频率。
所以真正的时钟频率应该是72mhz/(TIMX_PSC-1),我们设为tim_frepuency下面还会用到。
stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。
时钟的频率弄好了下面终于可以开说重点PWM了。
当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。
ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。
在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。
所以这也就控制了占空比。
下面是定时器1的配置代码:
GPIO_InitTypeDef GPIO_InitStructure2;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
//第一步:配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1 ,ENABLE);
//第二步,配置goio口
/********TIM1_CH1 引脚配置*********/
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出
GPIO_Init(GPIOA,&GPIO_InitStructure2);
/*********TIM1_CH1N 引脚配置********/
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出
GPIO_Init(GPIOB,&GPIO_InitStructure2);
//第三步,定时器基本配置
TIM_TimeBaseStructure.TIM_Period=1000-1; // 自动重装载寄存器的值TIM_TimeBaseStructure.TIM_Prescaler=72-1; // 时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//第四步pwm输出配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //设置为pwm1输出模式
TIM_OCInitStructure.TIM_Pulse=500; //设置占空比时间
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //设置输出极性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能该通道输出
//下面几个参数是高级定时器才会用到,通用定时器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化
//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出
选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//刹车输入极性TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
//第六步,使能端的打开
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1,ENABLE); //打开TIM2
//下面这句是高级定时器才有的,输出pwm必须打开
TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm输出使能,一定要记得打开
TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:使能的时候这两个局存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。
失能的时候可以直接进行读写而没有延迟。
另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload()
TIM_SetCompare1()这两个函数就可以了。