STM8 脉冲计数器

如何解决STM8 脉冲计数器

我正在开发直流电机的控制。这个电机有一个编码器,根据它的运动产生脉冲。

我需要通过监控脉冲数来控制电机轴的圈数。

我正在为此应用程序使用 SMT8S103F3。

这个想法是使用 Timer1 作为脉冲计数器。为此,我将定时器配置为接收外部信号,在本例中为编码器脉冲,并且每个脉冲必须增加计数器。

我遵循了文档 ST RM0016 第 17.4.3 章。但是,该应用程序不起作用。计数器未递增。

遵循开发的代码。

#

有什么想法吗?

如果定时器不是此应用的最佳选择,如何实现脉冲计数器?

脉冲频率为 700kHz。

解决方法

解决了。

要在 stm8 引脚上使用定时器,必须写入选项字节以更改引脚的功能。 这是通过编写 AFR0 来实现的。

使用定时器 1 通道 2 的定时器配置如下。

void config_counter(){
  TIM1_CNTRH = 0;
  TIM1_CNTRL = 0; //Reset counter
  TIM1_IER = 0; //Interrupt disabled
  TIM1_SR1 = 0; //Clear Interrupt
  TIM1_CCMR2 |= 1<<0; //External pulse source T1C2
  TIM1_CCER1 &= ~(1<<5); //Rising edge
  TIM1_SMCR |= (7<<0); //External Clock Source
  TIM1_SMCR |= (6<<4); //T1C2 Input Source
  TIM1_CR1 &= ~(1<<0); //Counter disabled
  
  return;
}

,

TIM1_CR1 |= ~(1<<0); //Counter disabled 不会禁用计数器。它保持 CEN 不变,并将所有其他位设置为 1 - 包括 OPM。你想要 &= 代替。 set_counter_updown 也一样。

,

这个问题有两种可能的解决方案。

带定时器的解决方案要求定时器的时钟输入与电机脉冲相关联,这需要一些外部硬件连接,我不知道您是否有可用的连接。好处是您只需读取计时器值即可了解圈数,并且使用预分频器可以缩放您的输入。缺点是定时器的数量通常是有限的(你只有一个或两个定时器),而且定时器总是被配置为计算电机转数,你不能用它做其他事情。

另一种解决方案是为电机脉冲关联一条中断线并编写中断处理程序。您需要(通过硬件)将中断与电机脉冲相关联,因此当您收到中断时,中断处理程序增加一个变量

一旦你有了这个......你只需要检查变量值是什么,因为变量的更新只是反映了电机转动了多少次。

volatile long loops = 0;

void motor_pulse_handler()
{
    loops++;
}

int main()
{
    /* this function installs the handler to be called each time the motor starts a new turn. */
    install_handler(MOTOR_PULSE_INTERRUPT,motor_pulse_handler);
    ...
    for (;;) {
        printf("\rloops: %ld",loops);
        usleep(10000);
    }
}     

函数install_handler是一个强烈依赖于硬件的函数。它通常由开发系统作为库函数提供,因为它需要了解一些处理器架构才能实现。您首先需要在操作中断相关控件时完全禁用中断。然后它必须激活以在相应中断线中的脉冲上中断 cpu(这是在参数列表中包含 MOTOR_PULSE_INTERRUPT 的原因,这应该使用适当的值 #defined使电机脉冲选定信号,而不是其他信号)最后它必须再次重新启用中断。当中断进入时,您的函数将在处理器可以执行的一系列操作的中间被调用。

通常,安装中断处理程序是一个两阶段的过程。实际调用的例程不是您传递给 install_handler 的例程,而是执行某些硬件操作的不同例程。中断处理程序在中断被禁止的情况下被调用,它应该:

  • 保存所有 cpu 状态(寄存器、标志等),以便在最后恢复状态。
  • 屏蔽这个设备的中断,所以它不会再中断(中断没有被设备确认,所以如果你启用中断,cpu会再次中断)
  • 启用中断,以便其他更高优先级的中断可以从此时开始中断 CPU。
  • 调用用户中断处理程序,以便更新计数器。
  • 再次禁用中断。
  • 确认中断。这通常意味着读取一些芯片寄存器以向中断硬件指示此中断已被确认。这会重置设备,以便在您从中断返回时不会出于同样的原因再次中断。
  • 恢复寄存器和标志(所有 cpu 状态),以便我们可以返回到 cpu 被中断的点。
  • 从中断中返回。这通常是一个特殊的返回指令(不是用于从普通函数调用返回的指令)

此解决方案的优点是您可以卸载信号处理程序,这将停止计数过程。同样,只有实现某种机制来路由中断才有可能将中断线重用于其他事情(这个问题类似于定时器中的问题,其中脉冲到达所选定时器的输入)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res