你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4283|回复: 35

[活动] (已公布)狂欢节答题(附加题)

 关闭 [复制链接]

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-11-28 10:05:17 | 显示全部楼层 |阅读模式
附加题
自行选型一个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中文官网注册邮箱私信给我(通过第一波活动的无需再次提供~)
查看答题积分榜>>(帖末)












回复

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
 楼主| 发表于 2017-11-28 10:05:47 | 显示全部楼层
MARK MARK MARK
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2017-11-28 11:21:12 | 显示全部楼层
本帖最后由 wolfgang2015 于 2017-11-28 18:02 编辑

自行选型一个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 CH1PWM Generation CH2PWM Generation CH3PWM 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()函数来实现脉冲数的发送。









回复 支持 反对

使用道具 举报

0

主题

31

回帖

0

蝴蝶豆

高级会员

最后登录
2018-5-23
发表于 2017-11-28 12:11:35 | 显示全部楼层
STM32L432KC
采用TIM2的4个比较/捕获通道加DMA可以产生出4路不同频率和占空比的方波
1)脉冲宽度一致,DMA地址不增加;
2)脉冲频率不同,设置不同的装载值,PWM使用单次触发。
3)发送的脉冲数超过65535个,使用DMA传输完成中断切换DMA传输的数据起始地址及发送数量,继续发送
回复 支持 反对

使用道具 举报

27

主题

403

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-12-6
发表于 2017-11-28 13:56:03 | 显示全部楼层
用DMA就行,不占用CPU时间
回复 支持 反对

使用道具 举报

1

主题

1093

回帖

9

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2017-11-29 01:07:29 | 显示全部楼层
选择STM32F302R8T6,前面电机控制培训刚用过的。
主要参考应用笔记AN4776,利用STM32定时器输出指定脉冲个数。
STM32定时器的单脉冲输出功能,让定时器在某个事件触发后的一段时间产生指定脉宽的单脉冲信号。
计数器的启动可由从模式控制器控制,可由比较输出模式或PWM输出模式来产生波形。

例:通过使用STM32定时器的主从模式实现周期性地输出指定数目的脉冲:
TIMER2与TIMER1主从连接,实现周期性的输出5个脉冲。
TIMER2 配置为主触发模式,触发TIMER1的计数;
TIMER1 配置为从单脉冲输出模式;TIM1_RCR=4;
捕获.JPG 捕获1.JPG
利用这个方法经过改造可实现输出多路可控制脉冲数的高速脉冲。


我刚入门不久,边参与边学习,班门弄斧了

点评

虽然指出了主从搭配,然而并没有从实际上进行设计题目所问道的实际解决方案  发表于 2017-12-1 12:23
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
 楼主| 发表于 2017-11-29 12:55:07 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

13

主题

718

回帖

164

蝴蝶豆

金牌会员

最后登录
2020-5-24
发表于 2017-11-29 21:46:51 | 显示全部楼层
题目分析:
自行选择一个STM32,为啥不来点干脆的,直接指定型号,毕竟STM32产品线上有11个系列,将近800个型号,从中选择还是难度的,还好,ST提供了很多工具,比如:STMCUFinder、STM32CubeMX可以大大简化选型难度。要求4路可控脉冲数的高速脉冲,节省CPU时间,而且不能频繁的进入中断。重点来了,4路(独立?)、可控脉冲数、高速脉冲(有多高?),节省CPU,中断少。第一反应就想到了STM32强大的外设:定时器/HRTIM,通过外设自己工作才能不耽误CPU。因此通过工具搜索初步定下来在速度快常用的F3/F4以及F7/H7系列,F7/H7对于我这个菜鸟来说太高大上,就在F3/F4中选择,发现F3在电机控制上非常厉害,有强大的HRTIM,但是此题要求的是可控高速脉冲,发现F3在此处似乎并不太合适,F3适合在高精度“花样”控制中,也许是自己低估它了,反正放弃了,最终选择了F4系列。以上废话可忽略,以下才是重点。
解决方案:使用多个定时器,工作在主从模式,
主定时器负责高速脉冲输出,工作在主模式,设定为PWM 模式1,CH1输出脉冲,脉宽设定为50%占空比,频率可调,开启自动装载功能,设定MMS用作从定时器的预分频器。
从定时器负责计数,工作在从模式,选择内部触发,并开启UIE, 在中断中控制主定时器的启停。
从来没这么用过,第一次,也算是为了学习,为了简单,选择4个主定时器、4个从定时器,这样一算就要8个定时器,还好,STM32最多的定时器有18个之多,看F4系列的参考手册,可以这样组合:
3主、2从;4主5从;10主、9从;13主12从;这样组合出4路独立的组合,而且都使用ITR2触发。除了F411有11个定时器外F4其他系列都有17个定时器,且APB1 Timer 时钟高达84MHz  APB2Timer 时钟高达168MHz 主频达到168MHz完全胜任,因便宜的F407系列就能满足。
方案验证:
手头有一块F411RE的NUCLEO板,因此就拿他进行验证。查看数据手册F411有1、2、3、4、5、9、10、11,除了9以为都支持主模,除了10、11都支持从模式,遗憾的是只能有三组满足,不过用于验证还是可以的,一组能实现,其他的也类似,输出100KHz高速脉冲,题目没要求多少算高速,按PLC常规的脉冲输出有20Khz\100Khz\200Khz\400Khz,所以就按100KHz做应该满足题目要求吧。
部分测试代码(HCLK=APB1 Timer =[url=]APB2 Timer=100MHz [/url]):
TIM3主、TIM2从
  1. void TIM2_IRQHandler(void)
  2. {
  3.        
  4.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  5.   {
  6.                 TIM3->CR1 &= (uint16_t)~TIM_CR1_CEN;
  7.                 TIM3->CCER &= (uint16_t)~0x001;
  8.                 TIM2->CNT=0;
  9.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  10.                 TIM_Cmd(TIM2, DISABLE);
  11.         }
  12.        
  13. }

  14. void OutputPulseOne(u32 Cycle,u32 PulseNum)
  15. {
  16.     GPIO_InitTypeDef GPIO_InitStructure;
  17.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  18.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  19.                 NVIC_InitTypeDef NVIC_InitStructure;
  20.        
  21.                 //脉冲管脚配置
  22.                 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  23.                
  24.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;             //TIM3_CH1输出脉冲
  25.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  26.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  27.                 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  28.                 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  29.                 GPIO_Init(GPIOA, &GPIO_InitStructure);

  30.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);
  31.        
  32.                 //主定时器配置TIM3
  33.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  34.        
  35.                 TIM_TimeBaseStructure.TIM_Period = Cycle-1;                                                                 //脉冲频率
  36.                 TIM_TimeBaseStructure.TIM_Prescaler = 0;                   //不分频
  37.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
  38.                 TIM_TimeBaseStructure.TIM_ClockDivision = 0;               //设置时钟不分割
  39.                 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  40.        
  41.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                       

  42.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //选择定时器模式:TIM脉冲宽度调制模式1      
  43.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  44.     TIM_OCInitStructure.TIM_Pulse = Cycle/2;                       //设置待装入捕获寄存器的脉冲值                                   
  45.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      //输出极性   
  46.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;   //空闲为低
  47.                 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  48.                
  49.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                                         

  50.     TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);        //启用主从模式
  51.     TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);                                        //主定时器可用作从定时器的预分频器

  52.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);                                                 //输出比较2预装载使能                           
  53.     TIM_ARRPreloadConfig(TIM3, ENABLE);                           //自动重载预装载使能  
  54.                
  55.                 //从定时器配置 TIM2               
  56.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  57.     TIM_TimeBaseStructure.TIM_Period = PulseNum;   
  58.     TIM_TimeBaseStructure.TIM_Prescaler =0;   
  59.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;     
  60.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  61.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  

  62.     TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2);
  63.                 TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1 );//为外部时钟模式SMCR 寄存器中的 SMS=111
  64.        

  65.        
  66.     TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);

  67.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  68.     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;        
  69.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  70.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     
  71.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  72.     NVIC_Init(&NVIC_InitStructure);
  73.                
  74.                 //启动工作
  75.     TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  76.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  77. TIM_Cmd(TIM2, ENABLE);
  78.     TIM_Cmd(TIM3, ENABLE);
  79. }
复制代码
OutputPulseOne(160,10)代表100KHz,10个脉冲
另外一组类似,使用的是TIM4主、TIM5从
效果如图:
两组同时输出15个脉冲、和10个脉冲
微信图片_20171129213051.jpg
两组同时输出10个脉冲、和6个脉冲
微信图片_20171129213103.jpg
两组同时输出8个脉冲、和8个脉冲
微信图片_20171129213119.jpg
两组尝试150KHz 输出10个脉冲、和10个脉冲
微信图片_20171129213136.jpg
最后附上已经摧残过很多次的F411板子
微信图片_20171129213125.jpg
此方案没有处理计数超过定时器定时溢出时的方法,可以通过中断来循环计数实现,扩展可实现4组输出,应该实现了题目要求,自己水平有限,就不在此班门弄斧了,期待学习高手更好的方案。

回复 支持 反对

使用道具 举报

13

主题

718

回帖

164

蝴蝶豆

金牌会员

最后登录
2020-5-24
发表于 2017-11-29 21:52:34 | 显示全部楼层
期间还测了测F411高达4Mhz PWM输出,很强大, 但已经失真很严重,2M还好。有机会拿刚换到的F7测测.
回复 支持 反对

使用道具 举报

41

主题

2476

回帖

282

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2017-11-29 22:15:59 | 显示全部楼层
附加题:
自行选型一个STM32的单片机,要求输出4路可控制脉冲数的高速脉冲,必须要尽可能的节省CPU时间,而且不能频繁的进入中断(只需提供解决方案,不用代码
一、首先,单片机的选型,因为需要高速脉冲,优先选择主频高的,STM32H743,定时器的时钟频率可达200MHz;
二、需要4路脉冲输出,可以采用TIM2的PWM CH1--CH4来输出,当然,如果所需要的4路脉冲频率不同,可以用4个独立的定时器的通道来输出;
三、节省CPU时间和不能频繁的进入中断,说明需要用单片机的硬件资源来实现。脉冲的周期、占空比由硬件PWM输出,都不是问题,主要是脉冲数量要可控。查看AN4013应用笔记定时器概览,定时器的从模式中的门控模式,可以满足要求 QQ截图20171129213235.jpg
四、那就需要另外一个定时器,作为主模式来触发TIM2的使能与关闭,采用TIM5的单脉冲模式,这个脉冲宽度设定为需要输出脉冲周期的N倍,N即为需要输出脉冲的数量。
五、通过STM32CubeMX大概配置一下,贴上部分截图(暂时未经实验验证,部分参数可能还需修改):
QQ截图20171129215637.jpg QQ截图20171129215655.jpg QQ截图20171129215707.jpg QQ截图20171129215721.jpg
六、如果4路脉冲的频率、数量等都不相同,或者都需要相互独立,则需要更换为独立的定时器来控制输出。
七、看到F3和H7系列都还有HRTIM(High-resolution timer),据说时钟倍频后可高达4点几GHz,无奈最近出差,都是抽晚上时间看看资料,也没能看懂怎么使用,说不定可以输出更高频率的脉冲,只能等以后有空再学习。
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版