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-10 10:12

STM32串口接收粉尘传感器数据
本文章主要记录STM32实现对粉尘传感器的数据采集及简单处理。 材料: 1、正点原子Mini开发板STM32f103RC 2、ZH03A激光粉尘传感器 3、USB TO TTL线(就是烧写51单片机的下载线)连接电脑和开发板上的串口2 4、电脑串口调试助手,用来查看数据 主要设计思路: 1、串口初始化,包括GPIO,外设时钟,NVIC等配置; 2、串口中断处理函数编写,即通过接收中断获取数据并且保存到数组,同时注意判断相关数据位; 3、发送数据,使用到了printf函数,需要重定向; 4、主程序初始化。 主要函数编写: 1、串口初始化,PA.2- USART2_TX,PA.3- USART2_RX,PA.9- USART1
[单片机]
<font color='red'>STM32</font>串口接收粉尘传感器数据
STM32平台上实现基于汽车音频总线的解决方案
A2B或“汽车音频总线”是一项主要为信息娱乐系统开发的新技术,旨在减轻音频线束的重量和成本。A2B 总线是单主多从系统,其中主控制器上的 A2B 收发芯片为主。A2B 收发器芯片通过单根非屏蔽双绞线支持多通道数字音频。此外,A2B 总线将直流电源传输到远程总线供电节点。A2B 收发器连接多个 IC 间声音 (I2S) 同步、脉冲编码调制 (PCM) 数据,节点之间最长可达 15 米,所有节点的总长度最长可达 40 米。 A2B 主节点生成时钟、同步和成帧信号以及从节点的直流电源。A2B 芯片可通过 I2C 进行编程,用于配置和从从设备读取数据。它提供对从收发器的寄存器和状态信息以及 I2C 到 I2C 通信的直接访问。 A
[单片机]
在<font color='red'>STM32</font>平台上实现基于汽车音频总线的解决方案
实现STM32 Flash的读写
写flash FLASH_UnlockBank1(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = FLASH_ErasePage(BANK1_WRITE_START_ADDR);//BANK1_WRITE_START_ADDR 要擦除的页起始地址 Address = BANK1_WRITE_START_ADDR; FLASHStatus = FLASH_ProgramWord(Address, data);//Adress 需要写入的地址,data,写入的数据 FLASH_LockBank
[单片机]
一个能效更高的USB-C保护解决方案
TCPP01-M12芯片可以在受电模式(充电)下保护USB Type-CTM接口,防止过压冲击接口针脚,VBUS线最大耐压24V,CC线最大耐压6V,还具有静电放电防护等安全功能。TCPP代表了Type-C接口保护,同时TCPP01-M12可与内置 USB-C Power Delivery (UCPD)控制模块的STM32 MCU配套使用。因此,微控制器STM32G0、STM32G4、STM32L5 或 STM32U5均可以与TCPP01-M12搭配使用,并且比用大量的外部器件更划算。TCPP01-M12 的独到之处还在于,当接口没有连接任何设备时,其静态电流为零。 TCPP01-M12: 保护USB-C的热度 USB-C的崛
[单片机]
一个能效更高的USB-C保护解决方案
stm32点个灯[操作寄存器+库函数]
stm32的使用和51单片机不同,单片机接上晶振接上电源 直接就可以操作io口,但是stm32的时钟是 经过了倍频器放大频率的,然后再由锁相环输出稳定的时钟频率。 这么做的带来了很多好处,虽然stm32的外部时钟只有8Mhz ,经过倍频器后就可以得到好几种的时钟频率 给不同的外设提供不同的时钟频率。 所以stm32有很多总线,这些总线的频率是不同的,而且在使用前总线是关闭的,使用外设前必须打开其对应的总线,这样也是处于为stm32降低功耗的考虑。 使用stm32的所有外设都要加入其对应的驱动文件。 对于stm32的GPIO口还需要注意的一点是,通过GPIO寄存器,可以把GPIO口配置成8种工作模式: 浮空输入
[单片机]
STM32时钟系统详解
1. STM32的时钟源主要有: 内部时钟 外部时钟 锁相环倍频输出时钟 1.1 详细介绍 HSI(内部高速时钟) 它是RC振荡器,频率可以达到8MHZ,可作为系统时钟和PLL锁相环的输入。 HSE(外部高速时钟) 接入晶振范围是4-16MHZ,可作为系统时钟和PLL锁相环的输入,还可以经过128分频之后输入给RTC。 LSI(内部低速时钟) 它是RC振荡器,频率大概为40KHZ,供给独立看门狗或者RTC,并且独立看门口只能依靠LSI作为时钟源。 LSE(外部低速时钟) 通常外接32.768MHZ晶振提供给RTC。 PLL(锁相
[单片机]
<font color='red'>STM32</font>时钟系统详解
STM32学习笔记(十) CAN通讯测试(环回模式)
1.CAN通讯的理解  想学习CAN通讯,那么要对通讯协议有一定的认知。通讯协议是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。  CAN通讯全称控制器局域网通讯,是用来在局域网中高效传输,处理信息的一种通讯方式。它采用数据块编码的方式,数据块根据帧类型的不同有四种格式,可使不同的节点接收到相同的数据,然后再根据各节点内CAN配置选择处理还是丢弃该信息(这与TCP/IP协议栈的链路层的MAC地址过滤很相似,是可以互通理解的),CAN的位流是按照非归零(NRZ)码方式编码,一个完整的位电平有显性和隐性两种方式。显性和隐性
[单片机]
<font color='red'>STM32</font>学习笔记(十) CAN通讯测试(环回模式)
STM32管脚重定义
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o... STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别
[单片机]

推荐帖子

WinCE模拟器上网问题?
在vs2005下定制OSDesign。怎样设置才可以在模拟器上使用IE网?WinCE模拟器上网问题?up
kento WindowsCE
关于CCSV5与MSP430F5529开发板连接问题
我是刚刚接触这一开发环境与软件的,在学习例程的过程中。我发现无法将程序下载开发板而且是编译的环节就出现了问题。编译显示出错:DebugAssertionFailed!File:isctype.cLine:67Expression(unsigned)(c+1)=256我选择VS2010进行调试修改,但是错误的文件不是我所编译的程序,而是ccsv5的安装根目录下的cl430.exe不可改动,只能显示反编译。这一问题是否跟我的电脑是win764位相关呢?还是其他的
zi_mian 微控制器 MCU
一个无线充电器拆解
无线充电技术主要利用电磁技术,在发射器将电流转化为电磁,手机通过内置芯片接收器将电磁转化为电流为手机充电。现在不仅越来越多的品牌手机支持无线充电技术,也会有越来越多的公共场所提供无线充电底座。2018年必定是无线充电器大火的一年。今拆解则是绿联另一款新品无线充电器CD176白色包装盒,采用天地盖打开方式。正面印着无线充电器底座的外观图片。附赠一条黑色充电线缆,另有产品保修卡、说明书。附赠一条黑色充电线缆,另有产品保修卡、说明书。CD176无线充正面采用一块阻燃PC材质面板,面
qwqwqw2088 模拟与混合信号
ARM,FPGA学习群QQ:37392778,有高级工程师指导做项目,想学习者加入
想学习ARM,FPGA,相关开发的,有工程师指导,现有开发项目,可长期指导ARM,FPGA学习群QQ:37392778,有高级工程师指导做项目,想学习者加入支持搂主,收藏我也想知道,正在找這方面的資料~~~~~支持,顶一下!友情Up!大家好,感谢长期以来朋友们的支持,本群已满已久,为了方便大家,新申请群48462765,欢迎加入新申请群48462765
treetree600 ARM技术
Sysgen 错误
BUILD:d:\\WINCE500\\PBWorkspaces\\JZ4740\\WINCE500\\VENUS_MIPSII\\cesysgen\\ddk\\inc\\ntddndis.h(863):errorC2220:warningtreatedaserror-noobjectfilegeneratedBUILD:d:\\WINCE500\\PBWorkspaces\\JZ4740\\WINCE500\\VENUS_MIPSII\\cesysgen\
daisyquan 嵌入式系统
《CMake 构建实战-项目开发卷》分享1—编译构建基础
《CMake构建实战-项目开发卷》分享1编译构建基础导言本书第一章《构建之旅》,从命令行编译源程序,从程序由单一文件构成,到多个文件构成,再到程序连接到静态库文件,程序链接到动态库文件,非常详细的描述了目标构建的关系、构建书序。最后引入Boost库,构建一个依赖于第三方库的程序。回首我的嵌入式开发历史,吃了多少编译的亏,吭哧吭哧解决了多少编译相关的错误,但是没有形成一个系统的知识架构,非常遗憾。感谢本书作者为我补全了编译相关的一些知识。浅谈Makefile
CoderX9527 编程基础
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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