做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。
PWM中有一个较为重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。
为了实现IO口上电压的持续性变化,能调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。相关推荐:STM32中PWM的配置与应用详解。
上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。
产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。
使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:
解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:
10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。
再解释下上面这一行,设置允许更新中断,即arr减到0以后能触发更新中断,还有别的类型的中断。
看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。
前面介绍完中断,再说一下PWM工作原理。与之相类似的文章:浅析PWM控制电机转速的原理。
假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有很大的可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。
模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。
模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。
这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。
上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。
这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。
这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->
CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。
这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。
上面的代码里没有对CCRx进行设置,是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,进而达到连续改变CCRx值得目的,例如:
PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。
预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。
1.概述: 本文介绍双极性SPWM控制的特点,双极性控制都是高频开关,没有工频开关。Q1,Q2同步开关,Q3,Q4同步开关。 2.双极性控制: 双极性控制的三角载波是有正有负和单极性控制的主要不同之处在于,双极性有个直流偏置。 双极性控制驱动: Q1,Q2驱动和驱动占空比包络: Q3,Q4驱动和驱动占空比包络: 桥臂中点电压和桥臂中点平均电压: 从桥臂中点电压能够准确的看出双极性操控方法是两电平,输出的电平为±Vbus,Part1提到的单极性控制是三电平的,输出的电平为±Vbus 和 0 。 电感电压和 电容 电压: 从电感的电压波形能够准确的看出双极性调制的应力比单极性调制的电感应力高。 小结: 损耗方面双极性
的特点 /
#ifndef _ADC_H_ #define _ADC_H_ #include type.h #include debug.h void ADCInit(void); uint16_t ADCGetData(uint8_t channel); uint16_t ADCGetAverage(uint8_t channel, uint8_t times); #ifndef CONFIG_CAN void adc_test(void); #endif #endif /* _ADC_H_ */ // input1~5 -- 模拟量IO口; input6~10 -- 普通IO口用 #define ADC_CHANNEL
下载调试 STM32 程序下载主要有两种方法:串口和JLINK。串口下载也可以扩展为USB,JLINK支持JTAG、 SWD。 STM32 的串口下载一般是通过串口 1 下载的,使用USB下载实际上也是应用这种方式。只是要在PC端下载USB转串口的驱动,在硬件端加一片USB转串口的片子。USB转串口的片子常用的是CH340,在PC端下端其驱动程序就可。另外还需使用STM32串口下载软件,受正点原子影响我使用FLYMCU,这个软件好用、易用,打开就能知道如何用。该软件可以在 免费下载。 特别提醒:别选使用 RamIsp,否则,可能没法正常下载。 需要在线调试时,JTAG
开发环境(3)----下载调试 /
本文介绍了基于DSPTMS320LF2407A并使用SPWM控制技术的全数字单相变频器的设计及实现方法,最后给出了实验波形。 常见的AC/DC/AC变频器,是对输出部分进行变频、变压调节,而且在多种逆变控制技术中,应用最广泛的一种逆变控制技术是正弦脉宽调制(SPWM)技术。在变频调速系统中,应用DSP作为控制芯片以实现数字化控制,它既提高了系统可靠性,又使系统的控制精度高、实时性强、硬件简单、软件编程容易,是变频调速系统中最有发展前途的研究方向之一。 TMS320LF2407A芯片简介 TMS320LF2407A是TI公司专为电机控制而设计的单片DSP控制器。它具有高性能的C2XLP内核,采用改进的哈佛结构,四级流水线操作,它不仅
全数字单相变频器的设计及实现 /
一、ADC的原理及定义 Analog-to-Digital Converter的缩写。中文译名:模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。其实就是一个取样、量化、编码的一个过程。 典型的模拟数字转换器将模拟信号转换为表示特殊的比例电压值的数字信号。比如电量、光照传感器等常用。 ---------------------------------------------------------------------------------------------------------------------------------------------------------
的ADC的原理与使用 /
前言:最近在搞GPRS的时候,遇到了这么一个问题,所使用的单片机为STM32F103RBT6,刚开始先写了个串口打印的程序,波特率设置为19200,可是在上位机上输出的信息总是乱码,检查了好几遍的代码,硬件等等就是没找到问题。于是就在上位机上对波特率从115200往下一个一个的试,终于,当波特率设置为38400的时候,打印信息正确,额滴歌神啊,这是啥状况呢,我在程序中明明设置的波特率为19200,为什么上位机上波特率为19200的时候不对,而为38400的时候输出正确呢?于是,又回过头来检查电路原理图和代码,Oh,My god,原来问题在这里,因此这篇博客将以我遇到的问题为起点,对STM32的HSE时钟做一个总结。 一、
的HSE时钟 /
目的:实现矩阵键盘的多位数据输入 思路:使用while循环来规避掉循环检测中键盘的重复输入。 注:键盘检测程序资源众多,此处不列举了。 参数: key_back():键盘检测函数,返回值为key_val(键值),无摁键时返回no_ipt(无按键时的回传值,自订) 方法: //进入while开始键盘检测,获得输入值后回传 u8 key_input_part(void) { while(1) { if( key_back()!= no_ipt) {return key_back();} } } //循环输入,将数据整合为多位并返回,函数传参为输入位数 u16 key_input(int a) { int
使用 stm32f3xx,需要存储一些掉电不丢失的校准信息,查阅手册得知:1、stm32 写 flash 的长度是固定的 16bit;2、擦除时必须整块(2Kbytes)擦除,给出某 flash 块内的地址,执行擦除命令就可以了;3、参考手册给出了最小擦写次数为 10K。 以上三点对于实际使用时的影响,首先,写数据必须以 16bit 为单位,很多 32bit 长度的值就不能直接用类似 A = B 的赋值语句的方法去操作了,可以统一转化为指向 16bit 无符号整形值的指针来处理。举例,有一个 32bit 长度的 float 变量 v_float,要存入地址为 (FLASH_ADDRESS)的 flash中: #define
及其控制 (寇宝泉,程树康编著)
FOC控制管理系统设计
的集成化复合式无人机飞控系统设计
【瓜分2500元红包】 票选DigiKey\智造万物,快乐不停\创意大赛人气作品TOP3!
【下载】LAT1317 STM32CubeProgrammer和STM32CubeIDE协同调试的方法
【下载】LAT1298 基于Azure USBx开发USB_OTG_HS MSC应用的几个问题
【下载】LAT1306 使用STM32CubeIDE填充未用FLASH区域
【视频】使用STM32cubeMX与STM32PackCreator的最初步骤
【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性
【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU
【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®
【下载】AN5609 基于STM32WB系列新产品开发Zigbee智能能源(SE)应用
【下载】RM0490 STM32C0x1 Arm®32位MCU参考手册
【下载】UM2986 STM32U5系列IEC 60730自测试库用户指南
【AI】意法半导体发布安全软件,保护STM32边缘AI设备连接AWS IoT Core的安全
【新品】意法半导体微控制器STM32H5探索套件加快安全、智能、互联设备开发
随着物联网(IoT)网络日趋复杂,物联网端点边缘处理的复杂度亦水涨船高。因而在大多数情况下要使用新系统来升级现有的端点,这个系统的微控制器需 ...
步骤1:安装必需的软件首先,安装必需的软件。为ARM安装gcc编译器:gcc编译器包含用于编译,链接和构建MCU的构建代码的工具。安装以下三个 ...
我们在做SPI应用时,有时希望能够通过定时器定时地触发SPI的收发,并利用DMA完成数据的传输。这里,我基于STM32L476芯片来做个演示,以供参考【 ...
网络的形成,无论是现在已趋于成熟的互联网,还是蕴含着巨大潜力蒸蒸日上的物联网,都是来自于一个个原本孤立的节点,因为某种互动关系或需 ...
在嵌入式系统中时钟是其脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作。外设部件在时钟的驱动下完成各种工作,比如串口数据的 ...
站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程