这两天在调步进电机,希望是使得步进电机每次都达到期望的高度。在查了一天的资料,发现大部分上传的资料都是使用CubeMX生成的,可复制性很高,但未免有失可读性,故上传我的心得经验。
本来原子哥的例程里有整合度很高的,已经封装好的精确控制步进电机前进距离的函数。无奈例程使用了高级定时器TIM8,TIM8需要复用的引脚会影响到CAN的通讯,无奈自行研究,最终决定通过PWM中断,计数脉冲数,以此实现精确控制步进电机的步距角。
话不多说,先谈谈我遇到的坑吧,我个人算是新手,所以在一开始调步进电机时,连初始化和基本步骤都不是很明白,所以下文会从最基础的地方开始。
第一次我选择了定时器4的通道2作为PWM的输出口,然而很快我就发现了TIM4_ CHANNEL2的对应引脚是PD13,复用了PD13 作为PWM输出口后,步进电机出现了上下乱移,不受程序控制的情况,无奈作罢。
第二次,我选择了定时器4通道1,引脚是PD12。于是进入了正常设置环节,

第一个Driverinit,初始化了PF7,PF9作为编码器的DIR+,和DIR-来控制方向。具体可参见备注。
第二个是定时器中断处理函数,调用的是TIM4的句柄。
第三个是TIM4的PWM波初始化。
其中关于2,3点的理解出了偏差,这是我踩得最大的坑!!!没有之一!!!
首先我要强调的是HAL_TIM_PWM_Start和HAL_TIM_PWM_Start_IT的区别。在我的理解中,使用前者只能成功设置时钟输出PWM波,而不能调用中断。而后者才是时钟中断的开启门户。
由于想要使用PWM中断,又因为对定义的不明确,我认为的是,既然在TIM4的PWMinit中,已经使用了HAL_TIM_PWM_Start_IT(&TIM4_Handler,TIM_CHANNEL_1)这个函数来开启了时钟4和时钟4的pwm通道中断,那么当然不需要再对定时器本身的中断处理函数进行设置。
也就是说,一开始我想当然地忘记了调用TIM4_IRQHandler设置定时器中断。
实际上,PWM中断应该是这样的一个调用过程。
首先进入时钟4的时钟中断,然后通过对各种电平的变化读取,会调用到图中重点标注的
HAL_TIM_PWM_PulseFinishedCallback函数,即我们控制PWM精确脉冲数的核心回调函数。
如上,这也就是必须要调用定时器中断处理函数的原因。

其次要强调的是PWM的MSP回调函数设置问题,如下图:

PWM_MspInit是定时器的底层驱动,值得注意的是,此函数会被HAL_TIM_PWM_Init()函数调用。
如图所示,我们首先定义一个GPIO类型的结构体,然后使能引脚所属的GPIOD时钟。
然后对PD12进行各种初始化设置,最后在HAL_GPIO_Init函数中对引脚初始化。
最后也是很容易踩坑的一点,忘记设置中断优先级,即
HAL_NVIC_SetPriority(TIM4_IRQn,2,2); //设置中断优先级,抢占优先级1,子优先级2
HAL_NVIC_EnableIRQ(TIM4_IRQn); //开启TIM4中断
这也是值得很多和我一样忽视了初始化重要性的新人朋友值得注意的一点,有中断,就要使能中断,并且设置优先级。
最后是HAL_TIM_PWM_PulseFinishedCallback的,没有什么技术化的细节。定义一个静态变量i,产生一个脉冲就i++一次。达到1000时,使能HAL_TIM_PWM_Stop_IT函数,直接关闭时钟4通道一的PWM输出。
最后的最后,还有一个小问题,这样设置的话,HAL_TIM_PWM_Start_IT在初始化时就被调用了,所以如果你设置正确,一打开板子就会使得步进电机前进。所以我们可以先在TIM4_PWM_INIT中注释掉这个函数,或者在main函数中先调用一次HAL_TIM_PWM_Stop_IT,停止PWM输出。
谢谢各位了,最后还是我的hxd提醒我了我的错误,我才能正常驱使步进电机前进固定距离。有什么问题,也欢迎大家在评论区和我交流。
附上约尔美图一张,希望大家天天开心,每天都有新进步新收获。

当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我真的只是不确定这意味着什么或我应该做什么才能让网页在我的本地主机上运行。现在它只是显示一个错误,上面写着“我们很抱歉,但出了点问题。”当我运行railsserver并在chrome中打开localhost:3000时。这是控制台输出:StartedGET"/users/sign_in"for127.0.0.1at2013-07-0512:07:07-0400ProcessingbyDevise::SessionsController#newasHTMLCompleted500InternalServerErrorin55msNoMethodError(undefinedmethod`