STM32 PWM波比较输出

发布者:和谐的24号最新更新时间:2022-04-24 来源: eefocus关键字:STM32  PWM波  比较输出 手机看文章 扫描二维码
随时随地手机看文章

关键配置

对应GPIO

NVIC中断管理

定时器初始化

定时器输出模式TIM_OC初始化(模式为TIM_OCMode_Toggle)

频率与占空比的计算

计数频率的计算

若使用比较输出,则ARR表示计数的上限,基本无用。计数频率由TIM_Prescaler成员变量配置。若配置TIM_Prescaler=71,输入时钟为72 M H z 72MHz72MHz,则计数频率为:

image.png

计数规则

当计数器数到CCR所储存的值时,输出电平就会翻转。

频率和占空比的配置

  由计数规律我们可以通过修改CCR值的方法来得到我们想要的频率和占空比。

  比如:计数频率为 1 M 1M1M,想要得到10 K 10K10K,占空比为80 % 80%80%的PWM波。

  令空闲输出电平为0,关闭影子寄存器以便立即赋值。

  当程序开始,立即进入中断,为CCR赋值为20,此时电平为低电平;

  当计数器数过20,翻转电平,变为高电平,再次进入中断,为CCR赋值为20+80;

  当计数器再数80,翻转电平,变为低电平,再次进入中断,为CCR赋值为20+80+20;

于是可见,数100为一个周期,其中20为低电平,80为高电平。输出PWM波频率1 M 1000 = 10 K H z frac{1M}{1000}=10KHz 

1000

1M

 =10KHz,占空比80 % 80%80%.

示例代码

从PA6和PA7输出两路PWM;PA6频率为10KHz,占空比为80% ;PA7频率为1KHz,占空比为20%


PWM驱动配置:


void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  // PA1 PA2

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);

}



void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;


  /* Enable the TIM3 global Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}



void PWM_Config()

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

GPIO_Configuration();

NVIC_Configuration();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* Time base configuration */

  TIM_TimeBaseStructure.TIM_Period = 65535;                // 在TIM_OCMode_Toggle模式下ARR几乎无用

  TIM_TimeBaseStructure.TIM_Prescaler = 71;                // 72分频,计数频率为72M/72=1M

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数方式为向上计数


  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


  /* Output Compare Toggle Mode configuration: Channel1 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   // 空闲状态为低电平

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);


  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);         // 关闭影子寄存器,当给CCR赋值时,即刻赋值


  /* Output Compare Toggle Mode configuration: Channel2 */

  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;


  TIM_OC2Init(TIM3, &TIM_OCInitStructure);


  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);


TIM_Cmd(TIM3, ENABLE);

TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);

}


中断代码如下:


extern __IO uint16_t CCR1_Val;

extern __IO uint16_t CCR2_Val;

uint16_t capture = 0;

u8 pa6_state=0,pa7_state=0;


float zhankong1=0.2;

float zhankong2=0.2;

void TIM3_IRQHandler(void)

{

  /* TIM3_CH1 toggling with frequency = 10K Hz */

  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)

  {

    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );

    capture = TIM_GetCapture1(TIM3);

if(pa6_state ==0)

{

TIM_SetCompare1(TIM3, capture + CCR1_Val*zhankong1 );

pa6_state = 1;

}

else

{

TIM_SetCompare1(TIM3, capture + CCR1_Val*(1-zhankong1) );

pa6_state = 0;

}

    

  }


  /* TIM3_CH2 toggling with frequency = 1k Hz */

  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)

  {

    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

    capture = TIM_GetCapture2(TIM3);

if(pa7_state ==0)

{

TIM_SetCompare2(TIM3, capture + CCR2_Val*zhankong2 );

pa6_state = 1;

}

else

{

TIM_SetCompare2(TIM3, capture + CCR2_Val*(1-zhankong2) );

pa6_state = 0;

}

  }

}

关键字:STM32  PWM波  比较输出 引用地址:STM32 PWM波比较输出

上一篇:STM32 EXTI外部中断小结
下一篇:STM32固件库的小结

推荐阅读最新更新时间:2024-11-16 20:01

STM32 UART2发送后中断的原因是什么?
SECTION 2 先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下 /******* 功能:中断方式发送字符串。采用判断TC的方式。即 判断 发送后中断 位。 输入:字符串的首地址 输出:无 *******/ void USART_SendDataString( u8 *pData ) { pDataByte = pData; USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据。网友提供
[单片机]
<font color='red'>STM32</font> UART2发送后中断的原因是什么?
stm32启动文件选择
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32
[单片机]
STM32出现HardFault_Handler故障的原因及处理方法整理
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 出现问题时排查的方法: 1、发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Return address、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址,因此在堆栈中反数第三个字即为出错位置。 2、默认的HardFault_Handler处理方法是B .将它
[单片机]
基于STM32芯片的电源监控器应用方案
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32 有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。 电源监控器 STM32芯片主要通过引脚 VDD 从外部获取电源,在它的内部具有电源监控器用于检测 VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。
[单片机]
基于<font color='red'>STM32</font>芯片的电源监控器应用方案
stm32的 开漏电路 与 推挽输出
===================================================== 开漏结构 所谓开漏电路概念中提到的 漏 就是指MOS FET的漏极。同理,开集电路中的 集 就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。如图1所示: 图1 组成开漏形式的电路有以下几个特点: 1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部 MOSFET 导通时,驱动电流是从外部的VCC流经R pull-up , MOSFET 到GND。IC内部仅需很下
[单片机]
<font color='red'>stm32</font>的 开漏电路 与 推挽<font color='red'>输出</font>
STM32实现DAC输出的相关设置
STM32 DAC简介 大容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于大容量产品,所以是带有DAC模块的。 STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。 STM32的DAC模块主要特点有: ① 2个DAC转换器:每个
[单片机]
[HAL库]STM32之DMA方式串口发送
目的:使用cube软件实现DMA方式的数据发送和接收 1.在cube Pinout中打开USART1,方式为异步通讯(Asynchronous); 2.在cube Configuration中打开USART1 Configuration,添加DMA通道(接收改为循环方式)以及打开usart的全局中断,在NVIC中调整优先级 3.生成代码,在keil中进行以下修改: 1)在main文件中建立发送缓存区和接收缓存区(两个定常数组) 使用HAL_UART_Receive_DMA(&huart1,aRxBuffer,sizeof(aRxBuffer)) 进行DMA的接收(等待接收) 使用HAL_UART_Transmi
[单片机]
STM32和ARM的区别
这个问题大概2009年的时候很多人就在问,请看09年的时候大家给出的若干比喻: http://www.amobbs.com/forum.php?mod=viewthread&tid=3784815&highlight 以后的ARM初学者也都在问。 笔者也是菜鸟,到网上搜了搜。下面先看一张图: 这张图是我在意大利与法国合资的意法半导体公司(ST,世界几大半导体公司之一)的官网上看到的。这说明,STM32是意法半导体公司的产品。 意法半导体(ST)后面为什么要加上M32呢? 这是由于该产品使用的是ARM公司的32-bit ARM Cortex MCUs,我想这就是STM32名字的由来(个人观点哈,反正也是菜鸟笔记)。 想起
[单片机]
<font color='red'>STM32</font>和ARM的区别

推荐帖子

3DG6C
本帖最后由paulhyde于2014-9-1508:56编辑请问有人知道3DG6C的引脚怎么分布吗?哪个是e,c,b脚。。。。3DG6C本帖最后由paulhyde于2014-9-1508:56编辑数字向上,自左向右:EBC本帖最后由paulhyde于2014-9-1508:56编辑脚朝上,外壳上的那个突起放在左边,其对应的管脚是e,然后顺时针方向依次为b和c。3DG6可以用9013代替。
cary334002 电子竞赛
伺服电机转子反馈的检测相位与转子磁极相位的对齐方式
永磁交流伺服电机的编码器相位为何要与转子磁极相位对齐其唯一目的就是要达成矢量控制的目标,使d轴励磁分量和q轴出力分量解耦,令永磁交流伺服电机定子绕组产生的电磁场始终正交于转子永磁场,从而获得最佳的出力效果,即“类直流特性”,这种控制方法也被称为磁场定向控制(FOC),达成FOC控制目标的外在表现就是永磁交流伺服电机的“相电流”波形始终与“相反电势”波形保持一致,如下图所示:图1因此反推可知,只要想办法令永磁交流伺服电机的“相电流”波形始终与“相反电势”波形保持一致,
eeleader 工控电子
mini2440上USB转串口的问题,大家是如何解决的?
试过好几根了,都是乱码在开发ARM9mini2440时,有谁用过好用的USB转串口啊?mini2440上USB转串口的问题,大家是如何解决的?恩,我的也有问题:只能从开发板接收数据没法发送数据回复楼主bootloader的帖子Z-TEK力特的USB转通用串口线不错,收发数据正常。这个没用过呢就进入BOOTLOADER了
bootloader 嵌入式系统
一个较大型的单片机系统如何设计,急!
各位大虾们,我刚上班不久,单片机知识只限于书本的知识,根本没实际经验,现在碰到一个设计一个单片机控制系统的难题,望各位哥哥姐姐们帮偶看下,能不能讲的详细些(最好帮我出个电路原理图),在此先谢过了~开关量:69个38输入31输出温度模拟量3路压力模拟量3路另两路模拟量输出以控制阀门开度另外从一测速电机得到一高速脉冲,对其计数而换算的到电机的速度系统的28种故障信息将与另一单片机系统通过通讯方式进行显示这系统我改如何下手啊,硬件选型我都没点眉目,各位帮下偶啊~一个较大型的单片机系
suifengmomo 单片机
问个linux core文件机制相关的问题
内核2.6.21root文件系统下的/etc/sysctl.conf中-------------------------------kernel.core_uses_pid=1kernel.core_pattern=/logdir/core-------------------------------------(logdir目录有可写权限)/etc/profile中-------------------------------#Nocorefilesbyd
xzl Linux与安卓
在工程Rebuild All 正确,但Load Program时有问题的原因!!
我在CCS环境中编译一个数据采集工程,结果都正确,无错误,无警告!但是在LoadProgram时出现:Dataverificationfailedataddress0x****.Pleaseverifytargetmemoryandmemorymap.这种对话框出现次数达10以上,但是每次点击确定后LoadProgram仍然会继续,最终也会出现反汇编程序.点击RUN后,程序也能运行,只是没有数据采集的结果!!请问这
huadousjw999 模拟与混合信号
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved