附加题:自行选型一个STM32的单片机,要求输出4路可控制脉冲数的高速脉冲,必须要尽可能的节省CPU时间,而且不能频繁的进入中断(只需提供解决方案,不用代码) 虽然是附加题,还是希望大家能参与进来。或者,你最认同哪三位的答案呢? 答案如下: 利用主从定时器协助的方式来进行对STM32外设的极致使用,答DMA是要扣分的。(采用DMA方式,在高速的时候会过多的占用总线时间,不符合题目中的尽可能的节省CPU时间的目地) 1、自行选型一款STM32单片机,考得选型能力,根据项目要求选出一款比较合适的芯片 2、输出4路高速脉冲并且脉冲数可控,节省CPU,并且少进入中断,考的是对STM32的外设理解能力以及主从定时器协助能力 本题最佳答案为:@nyszx,其次是:@dsjsif 和 @landeng1986 @dsjsif 虽然也指出了定时器的协助,但是并没有实际指出定时器如何具体的搭配和解决思路 @landeng1986 虽然指出了主从搭配,然而并没有从实际上进行设计题目所问道的实际解决方案 @wolfgang2015的回复有待商榷,@zeropandragon 回答不对 本帖为 #狂欢节第二波# 活动的附加题,也是最后一题,决定前3的最终排名和DISC归属 本题为开放性题目,届时会根据答题结果,进行点评&排名 答题时间:2017年11月28日 10:00 - 11月30日 10:00 (两天) 本题由@nyszx、@landeng1986、@Zeyo_Pendragon、@wolfgang2015、@dsjsjf 5位大佬参加,其他网友也可以参加(但不计分) 另外, 请在第二波活动中答对3题及以上(即积分榜蓝色区域)的小伙伴,请速速把STM32中文官网注册邮箱私信给我(通过第一波活动的无需再次提供~) 查看答题积分榜>>(帖末) |
另外一组类似,使用的是TIM4主、TIM5从
效果如图:
两组同时输出15个脉冲、和10个脉冲
两组同时输出10个脉冲、和6个脉冲
两组同时输出8个脉冲、和8个脉冲
两组尝试150KHz 输出10个脉冲、和10个脉冲
最后附上已经摧残过很多次的F411板子
此方案没有处理计数超过定时器定时溢出时的方法,可以通过中断来循环计数实现,扩展可实现4组输出,应该实现了题目要求,自己水平有限,就不在此班门弄斧了,期待学习高手更好的方案。
说到脉冲可控,控制的方法很种类很多,频率、数量、脉宽等等,从脉冲控制方式诞生的开始就有多种技术来实现,从无集成电路方案的晶体管、电子管、555、8051、再到各种ARM,应用领域不可说不广从单路再到多路控制,特别是多路互补PWM在步进电机领域有很重要的使用。
个人认为本地题的关键词
第一层为:
4路、可控制、脉冲数、高速脉冲
第二层为:
节省CPU时间
第三层为:
不能频繁的进入中断
至于是否需要“多路正交“、"用脉冲来代替正弦波" 等都不是该题目明确表达的内容及含义,因此应排除指定用途,因此这题目的答案就不能按某特定用途的解决方式来解决。
输出脉冲,最简单的就是控制PIN脚的电平高低,再计数获得电平高低输出时间长短 和 这种波形的电平周期性来获得一定数量的脉冲信号。
高速脉冲信号:那么这就需要涉及到高速脉冲的测量,拿示波器是一个方法。达到一定频度的持续脉冲就是高速脉冲。另外的一个就是用MCU自身的定时器来测量高速脉冲。
如果要测量4路就需要4个定时器来测量(这是做产品时要考虑的,现在题目没有要求测量可不考虑这项内容,但做产品时需要考虑的更多)。
可控制、脉冲数:这里要求的是脉冲数量有要求。
利用外设手段来控制脉冲数量是重点
可控的因素有,MCU计数、计数器、数组等方法。都是计数的方法,这就是一些控制数量的方法;
利用定时器来计数,那么要在判断定时器数量要求。
数组来计数,利用数组的长度来计数。
从数量感知来说,可以在脉冲输出后感知计数,另外需要在脉冲源侧进行计数输出。
接着第二层说了:节省CPU时间,
这里就排除用MCU来计数的方法,需要利用外设计数,这里就有几种方法 计数器、DMA等方法节省CPU时间。
第三层不能频繁的进入中断
这里提到了中断,不能频繁进入,不是不能进入,而是计数时进入中断的频率不能太频繁。
1、利用输出后的感知来计数时,每次计数都是一次中断,占用大量的MCU中断所以不可取;
2、利用输出源的计数,用一个计数器来计算次数、用一个计数器来控制脉冲,这里有一种技术可以利用,就是溢出,出现了溢出中断,就停止发送脉冲。好方法。。。。
3、利用DMA数组+1的方法来发送,发送的次数限制,受数组的大小,这也是好方法。。。
当需要对2和3比较二者优劣时,就要分析两者边界问题上的影响:
1、中断与数组控制范围?
2、中断与数组控制触发的时间长短,是否对脉冲数量产生影响?
3、定时器与DMA的中断是否会被拦截屏蔽,拦截屏蔽后对脉冲数量输出是否有影响?
4、在中断相同优先级下,是否能准确控制脉冲数量?
自行选型一个STM32的单片机,要求输出4路可控制脉冲数的高速脉冲,必须要尽可能的节省CPU时间,而且不能频繁的进入中断(只需提供思路&方法,不用代码)
题目思路分析:
1、“输出4路可控脉冲“, 需要用到的MCU定时器资源进行脉宽调制(PWM),所以,高级定时器 T1、T8,及普通定时器T2~T5就能满足;
2、"必须要尽可能的节省CPU时间,而且不能频繁的进入中断", 需要降低控制MCU控制寄存器频度和数量,将MCU的工作量释放出来,这里选用DMA进行数据传递;选择DMA就需要MCU的参考对定时器进行选型,要选择具备4通道DMA输出的定时器方可使用,比如Timer1、Timer3。其他某些DMA通道缺失或者通道不够的定时器需加以排除;
另外,不能频繁的进入中断,而且是满足"高速"最先可以使用DMA数组的方式进行,将发送脉冲数组+1的数量(数组最后一个字为0,表示停发脉冲)作为DMA数组;如果发送高速脉冲数超过65535个,则可以使用DMA传输完成中断中切换DMA传输的数据起始地址及发送数量,继续发送。
3、使用CubeMx将芯片选择、定时器选择、DMA选择好,使用HAL方式输出代码,让代码具备
以下功能关键点:
以选用的MCU是STM32F401RE(84MHz主频设置)为例:
1)在CubeMx界面中,选中Tim3定时器中Channel1()、Channel2()、Channel3()、Channel4() 的下拉框,分别配置 PWM Generation CH1、PWM Generation CH2、PWM Generation CH3、PWM Generation CH4。
2)在TIM3配置界面里,将Prescaler设置为84-1,Counter Period设置为1000-1, 脉宽调制的波形频率为1KHz。如果高速,可以调节分频系数,增加DMA队列中需发送脉冲数量,以达到高速脉冲频率的发送要求。
3)占空比默认为0,极性为低电平;
4)DMA设置中,分别将TIM3_CH1、TIM3_CH2、TIM3_CH3、TIM3_CH4 对应的DMA数据流(DMAx Stream);
5)生成代码后,观察stm32f4xx_hal_msp.c 文件中中 HAL_TIM_PWM_MspInit(......)函数中具备 DMA和Timer的相关配置函数;
6) PWM输出的数量通过DMA数组的方式来定义,能降低对中断的调用次数。 启动DMA命令 HAL_TIM_PWM_Start_DMA(......)
或者用 HAL_TIM_PWM_Start() 配合 HAL_TIM_DMABurst_WriteStart()函数来实现脉冲数的发送。
采用TIM2的4个比较/捕获通道加DMA可以产生出4路不同频率和占空比的方波
1)脉冲宽度一致,DMA地址不增加;
2)脉冲频率不同,设置不同的装载值,PWM使用单次触发。
3)发送的脉冲数超过65535个,使用DMA传输完成中断切换DMA传输的数据起始地址及发送数量,继续发送
主要参考应用笔记AN4776,利用STM32定时器输出指定脉冲个数。
STM32定时器的单脉冲输出功能,让定时器在某个事件触发后的一段时间产生指定脉宽的单脉冲信号。
计数器的启动可由从模式控制器控制,可由比较输出模式或PWM输出模式来产生波形。
例:通过使用STM32定时器的主从模式实现周期性地输出指定数目的脉冲:
TIMER2与TIMER1主从连接,实现周期性的输出5个脉冲。
TIMER2 配置为主触发模式,触发TIMER1的计数;
TIMER1 配置为从单脉冲输出模式;TIM1_RCR=4;
利用这个方法经过改造可实现输出多路可控制脉冲数的高速脉冲。
我刚入门不久,边参与边学习,班门弄斧了
点评
方法2,采用DMA的方式,DMA中断了就可以关闭PWM了
主要用作电机控制
“应用笔记AN4776”不是万能的,我也考虑过,经过思索我选择不用该方法是有原因的
虽然TIMER级联方式是解决题目之一,但考虑到这种模式下太占用Timer数量,对于通道数低的尚可,如果面对4个及以上,6个、8个的通道不是最有的选项,对MCU的TIMER资源有着要求。
用DMA虽然浪费内存资源,在内存/Flash易扩展的今天,是一个低成本的解决方案,应该是优于Timer级联,4通道已经需要8个Timer,对那些天生Timer不够用的MCU来说,就无法实现,使用DAM方式应该是最容易普及的方式(外扩SPI Flash等方法)
而且脉冲数量不受65535的限制。
用DMA方式,不会造成脉冲丢失的情况。
具体的可以参看 http://www.stmcu.com.cn "首页 / 设计资源 / 本地化资源"板块的相关文档
STM32L053可控PWM脉冲方法之DMA
文档说明:目标要求:系统时钟8Mhz,6个PWM脉冲。实现上述目标的方法有很多种,比如两个定时器级连,定时器定时中断翻转IO口,等等,这里使用DMA的方式去实现。
STM32L053可控PWM脉冲方法之DMA.pdf
DMA本来是个很好的方法,但是这个方式只能用于低细分或者低速场合,因为加速过程的脉冲数不能太多,否则存储空间够呛。固定加速模式还能放在flash,如果是动态加速模式(加速曲线每次运行可以变化)必须放在ram中就受到很大限制了。
你可以计算一下16细分下用1s加速到2000转(梯形加速)用的总脉冲数
而且,你这个数组还要设计成“0 脉冲数 0 脉冲数 0”的结构,否则你用DMA传输完成中断的方式来断开就太慢了,你必须直接硬件关闭定时器!必须以最快的速度关闭,也就是说不能用软件去操作。一个中断响应的过程就会多发几个脉冲,最可怕的是,多发多少个你还没法统计。
同时,DMA通道时很珍贵的,因为外设之间的DMA是复用的。4路高速脉冲你得用4个DMA+4个定时器通道。你这里使用了,其他更需要大数据的外设就没得用了!所以选型很关键!
不过定时器就不同了,可以看到现在STM32里存在有很多很多的定时器。