历史上的今天
今天是:2025年03月03日(星期一)
2021年03月03日 | 单片机的状态机框架编写
2021-03-03 来源:eefocus
在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。
其实有很多地方可以使用这种思想。比如传感器的数据采集,因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsm + timer的方式来提高CPU的使用率
一、传感器中使用fsm的方法。
大家都知道,ds18b20的采集是比较慢的,发送转换指令后,最慢需要等待720ms,这个时间有点太长了。简直不能忍受。
如下所示:我采用了11bit分辨率,0.125的分辨率足够了,作为温度参考而已。
The resolution of the temperature sensor is user - configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively.
Temperature Conversion Time t CONV
9 - bit resolution 93.75 ms 0.5
10 - bit resolution 187.5 0.25
11 - bit resolution 375 0.125
12 - bit resolution 750 0.0625
那么我肯定不是死等的,死等,多浪费cpu,效率太低了,实际工作中根本无法接受。
因此,做了一个状态机:
int main(int argc, char const *argv[])
{
while(1)
{
ds18b20_discope();
}
return 0;
}
void ds18b20_discope(void)
{
switch (ds18b20的状态机的全局变量)
{
case 发送命令:
发送转换命令
赋值到等待装态
break;
case 等待装态:
判断是否有超时,
如果有超时,则:读取,计数器清零,并回到发送命令状态
否则,do nothing
break;
default:
break;
}
}
定时器的基准中断可以自己细化,我是50ms一个中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
如果ds18b20已经处于等待状态,
则计数++
}
这样就是一个简单的传感器定时采样的状态机思路,不会死等,效率较高,而且稳定。
注意ds18b20的时序性比较严格,网上说不能被打断的,但是后来移植到freertos中,也是可以的,温度采样还算稳定,但是考虑到后续程序比较大,该框架有点费时间,因此还是裸机了,状态机的思路基本能解决。
史海拾趣
|
出来作研发也一年了,很有些体会。在这里想与大家分享下! 1. 不要把自己搞成“实验机器”,要多在课题开展前进行详细的课题论证,信息搜集和筛选。 企业一般做课题都很着急,课题进度要求很快,作为研发人员,要做大量的实验,筛选路线,打通 ...… 查看全部问答> |
|
人们可能会对电子产品的开发与设计方法坚持某种不变的观念,甚至对解决不同问题所采用的器件这样的小事都有某种思维定势,这是可以理解的。 我认识到,对于电子设计人员来说,“熟悉招致轻视”这样的说法并不适用于他们。甚至那些我所认识的最有创 ...… 查看全部问答> |
|
程序如下;怎么ADC0809一直处于忙状态 (P[0..7]接D[0..7]P0接数码管) #include #define uchar unsigned char #define uint unsigned int uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示码0-9 ...… 查看全部问答> |
|
我的嵌入式产品用的DM9000a, 用一台电脑能ping 通(偶尔丢包),不断电情况下,切换成另一台电脑,有时能ping通,有时ping 不通,并且10M/100M以及LINK灯灭,怎么回事啊?谢谢 … 查看全部问答> |
|
如何把 51 单片机中的 .c 文件和 .h 文件 和 VC写的工程文件做成库 问题一: 在 51单片机 中用 C 写的 .c 和.h 文件,如何做成库呢?51的编译器是 IAR 问题二: 如何把VC写的一个 C 工程文件做成库呢? 问题三: 老大只说让我把上面这两种 C 语言写的函数和文件做成库,应该是做成 lib 库呢,还是做成 dll 库呢 ...… 查看全部问答> |
|
高科技大型上市公司招聘: 嵌入式系统设计工程师 /通信产品设计工程师 / 系统软件设计工程师 工作地点 深圳 本公司是深圳一家高科技大型上市公司,主要经营电力系统产品生产研发,微电子产品生产研发,光磁设备,公司内有员工高层公寓,食堂,文体活动中心,员工家属楼多处,座落于美丽的深圳市福田区笔架山与莲花山之间,公司目前有员工6000多人,工程师及 ...… 查看全部问答> |
|
参考了一些桌面上的方案,发现在CE4.2下面都用不了,要么是mutex函数不支持多个参数,要么就是用不了Process类,大家能不能帮忙想想办法啊,看怎么实现判断程序是否运行的效果,如果已经运行了就不要再运行。… 查看全部问答> |
|
正在开发wince下的驱动,能否通过应用程序来动态调整TFT的分辨率?比如说从640x480调整到320x240,调整过程中WINCE不能重新启动? 我发现可以通过应用程序来进行屏幕旋转,有没有调整分辨率的函数? 谢谢… 查看全部问答> |
|
使用的芯片是413 采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下: #include "msp430x41x.h" unsigned int m=1,l=1,o=1 ...… 查看全部问答> |




