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

STM32G4 定时器

[复制链接]
XH750507 提问时间:2023-11-10 18:41 / 未解决

电压电流等十余个参数需要做到超过额定值一定的时间后输出故障指示

请问多个参数如何实现精准的计时?多个参数的计时又不能互相影响?

也许同一时间只有一个参数会超过额定值,也许同一时间有多个参数超过额定值

计时精度:有的参数需要精确到1ms 有的参数需要100s

systick已经用作精准延时,在延时中计数器会清零。

那么计时有什么好的方法呢?

感谢 大神们请指点个思路

收藏 评论3 发布时间:2023-11-10 18:41

举报

3个回答
watershade 回答时间:2023-11-11 23:49:03

给你说一个方法,你定义一个结构体,比如:

typedef struct{

unsigned long err_trig_ms;   //开始超过额定值的时间点,只起记录作用用来产生err_commit_ms

unsigned long err_commit_ms;  // 等待确认故障的时间点,由触发时间点确认

uint8_t err_id;               // 每个错误的id,建议使用enum定义好

uint8_t is_err_trigged;       // 是否此错误已经被触发

}PassLimit_Fault_Info_t;

这个结构体每个故障定义一个。


typedef struct{

uint8_t next_trig_id = 0;  // 0表示无故障,其它id表示下一次需要检查的fault的err_id
unsigned long next_check_point; //下一次需要比较的时间点,由next_trig_id确定

uint8_t on_fault_cnt;      // 正在发生等待确认的故障id,故障已经清除或者已经确认的不再此列表中不计算


}FAULT_MGMT_t;
static FAULT_MGMT_t sys_fault_mgmt;  //系统故障管理结构体

每次故障被触发的时候就刷新当前发生故障的结构体,然后更新一下sys_fault_mgmt。比如当前的sys_fault_mgmt.next_trig_id不为零,就比较一下当前发生的故障要检查的时间点是否早于sys_fault_mgmt.next_check_point.如果更早就用这个故障的特征刷新。如果更晚就不用刷新。总之在故障产生、清除和确认的时候都刷新sys_fault_mgmt。而每次1ms中断的时候就只比较sys_fault_mgmt上面的事件。这个比较很简单不会耗费很多资源。

个人觉得当故障是这样的时候,裸机程序可以这样管理故障。当然如果你的系统有现成的链表。那么用链表的方法可能更好。就是说每次将最先需要检查的id放在链表的头部。依照事件顺序,插入新发生故障的链表可能会更好。

xmshao 回答时间:2023-11-12 15:19:28
实现你目前需求应该没啥大问题,属于纯粹软件处理问题了。


提供点参考思路。其实在早期MCU里TIMER也就1个或2个,
这么使用是常见的。


定时精度就设置为1ms. 如果说systick单独使用了,
单独拿个其它通用定时器无妨。设置多个不同的变量应对
不同的超时计时。


发生某事件需要设置超时值,开启超时计时,在定时中断里
检测超时值是否已到。


比方,为过流超时管理设置变量TIMEOUT_I,为过压设置超时管理变量
TIMEOUT_V等。使用共同中断对各个超时变量进行监测。


在中断里,如果超时变量本来就是0则不予理睬;如果是非0进行自减后若变0值
则视为超时值已到,得作相应处理。
butterflyspring 回答时间:2023-11-13 10:38:26
楼主的参数最小的精确到1ms, 对于G4运行速度来说绰绰有余。

G4有很多定时器和通道,根据超时范围可以通过设置比较值产生相对比较中断来确定ms级别的超时。

通过RTC的ALARM 来确定秒以上的超时。

另外选个通用定时器,仿造 systicK 再来一个1ms 计数也很方便。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版