【STM8手持示波仪】软件设计讨论
我的初步构思软件分为三层1、应用层:波形的显示、波形相关参数计算显示、人机交互及功能设置(触发方式、采样率、量程设置)
2、驱动层:液晶显示驱动、ADC采样(应该用TIM1触发ADC采样吧)、按键驱动、串口驱动(便于调试)、定时器
3、STM8固件库层
还不太成熟,请大家讨论,还望有相关经验的人能指点一二。 能不能让ADC自由采样,由定时中断信号来读取ADC的转换值. 你的意思是ADC连续采样吗?这样不方便控制采样率吧? 我个人建议从顶向下设计,先把各个屏幕定义一下,然后定义每个屏幕之间的跳转和事件。
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427789.GIF
基于状态机的软件开发 (原文件名:StateMachine.GIF) ghost2
哈哈,我也是打算用状态机来开发。
但上面你给的图不是为这个项目设计的吧? 【4楼】 ifree64
>>> ghost2
>>> 哈哈,我的意思也是用状态机来开发。
>>> 但上面你给的图不是为这个项目设计的吧?
这个图不是本项目的,我还没这么快入手。:)
状态机框架结构上比较清晰,也不是很耗资源,利于分模块开发 能不能像用AVR那样,有定时器中断自动触发ADC转换,ADC中断就是读出AD值?主程序就是状态机运行? 【6楼】 ZealotNH 发仔
>>> 能不能像用AVR那样,有定时器中断自动触发ADC转换,ADC中断就是读出AD值?主程序就是状态机运行?
ADC本身需要时间,放在中断里面不是很合适。
建议时间中断里触发ADC,然后ADC转换结束中断里获取转换结果 是ADC 设置时 设置成 T0或T1触发ADC转换。ADC转换结束中断程序把ADC值读出标识状态,并设置下次的转换通道 等等。
不是在中断中执行ADC单次传换。
例如这样,M48的程序
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 500.1uSec
// actual value: 500.000uSec (0.0%)
void timer0_init(void)
{
TCCR0B = 0x00; //stop
TCNT0 = 0x00; //set count
OCR0A=0x47;
OCR0B=0x47;
TCCR0A = 0x03;
TCCR0B = 0x0B; //start timer
}
//ADC initialize
// Conversion time: 90uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
// ADMUX = 0x47;//select adc input 0
ADMUX = AD_CH;
ACSR= 0x80;
ADCSRB = 0x04; //定时器0溢出转换
ADCSRA = 0xAF; //0b1010 1111
}
#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{
unsigned int T=AD_ADD;
unsigned char CT;
//num_disp2(ADC>>2);
T=T+ADC;
AD_ADD=T;
CT=ADC_coute;
CT=CT>>1;
if(!CT)
{AD_CH_P_PASS=AD_CH_P;
if(AD_CH_P==7) AD_CH_P=0;
else AD_CH_P++;
ADMUX=AD_CH;
CT=0x10;
sbi(SYS_RUN_state,ADOK);}
ADC_coute=CT;
} STM8有外部触发
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427903.JPG
(原文件名:未命名.JPG) ADC_ETR就是外部触发信号输入 Internal TGRO trigger from TIM1。把TIM1 设成200K频率。
我什么资料都未看~ STM8的定时器太强大了,比起以前熟悉的ATMEGA16来说,简直是强大太多了。但是也复杂多了,数据手册上说明的好像有点乱,我还没有完全吃透。
我的想法是用TIM1来触发ADC转发,ADC转换结束后产生中断,在中断中将ADC转换结果存到缓冲区中。为了效率ADC选择左对齐,只读高字节放弃第字节,因为192X64液晶没有那么高的分辨率。缓冲区存满后在调用显示子程序送显。 STM8S208RB看上去ADC时钟可以设置到6MHz,转换时间2.33us,这样应该可以达到400K的采样率。 【12楼】 ifree64
这个我倒觉得可以探讨一下
我的想法是尽量保留信息量,显示屏的数据跟实际数据不要混淆
这样在暂停采集数据以后,可以通过调节量程看到更细致的数据
不过,这样做的话,资源需求比较大,程序流程走得复杂一些,不知道会不会影响ADC的速度? 【14楼】 dvhome
-------------------
硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示? 硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示?
--------
这样CPU间需要高速度数据传输,用什么方法,并行?串行? 楼上的方法是个好方法,感觉比较好.一个MPU就相当于ADC+FIFO.
数据传输的话,用并行的吧.速度快,控制容易. 是否用2个CPU要慎重,我也思考过用2个CPU,因为是在2个CPU之间进行采样数据的传递,这样做有没有真的减轻显示cpu或者采样cpu数据处理的负担?
我的意思是采样的cpu将数据传递给LCD和将数据传递给另一个cpu有区别吗? to【14楼】 dvhome
这样在暂停采集数据以后,可以通过调节量程看到更细致的数据
不是很理解,暂停采集数据后,如何调节量程看到更细致的数据?是指如果信号很小的话,也就是采样数据很小的话,将数据乘以一定的比例再显示吗?
如果是这个意思,只要在高速采样的时候,单片机来得及在中断中将数据保存起来,那么保留10位的采样结果也没有关系。
关于性能我的简单计算,不知对不对,大家指正:
6MHzADC采样时,一次ADC转换用掉14个ADC时钟,如果CPU时钟24MHz的话,一次ADC转换用掉了14*4=56个CPU时钟。如果用中断来读取采样结果,中断的现场保护和恢复时间为9+9=18个CPU时钟,还剩38个CPU时钟用于其他的处理,这个时间是否够? 感觉没多少,数据采集是硬件完成的。数据读出只需要不多的时间。cpu间通讯也是需要时间的。
除非数据采集的cpu也处理数据。 数据读出不需要很多时间,可是LCD的显示,其他按键的响应,数据的判断,会需要不少时间的. 数据处理用的时间最多,如果做个均方根 8位的CPU够忙了。
做过市电128个点的均方根 用M16 16M。1602显示要把驱动拆散,程序才能正常运行。
液晶也要很多时间。
按键时间可以忽视。 苍天啊,晚上打的大长篇居然发送失败,没了,唉……
重新再来
【15楼】 smallsnail 燕 青
我的看法跟 【18楼】 ifree64 一样,我认为没有必要使用两个MCU,这样软件、硬件都会更复杂,而实际性能并没有增强。
【19楼】 ifree64
是的,大概就是这么个意思
我的想法是,在程序架构里面,把采样数据和显示数据分离开来。采样数据是直接保存原始的数据,显示数据根据设置的参数将采样数据进行坐标压缩或拉伸变换,然后再显示。这样会不会是画蛇添足了?? TO【23楼】 dvhome
把采样数据和显示数据分离开来。采样数据是直接保存原始的数据,显示数据根据设置的参数将采样数据进行坐标压缩或拉伸变换,然后再显示。这样会不会是画蛇添足了??
<BR >
这样做好,CPU应该忙得过来。 我同意ZealotNH 发仔的意见,可以加个STM32的片子72M的用来做计算,两个片子通过SPI口通信,STM8采样好之后就把采样数据发给STM32,STM32算好再把值传给STM8,也就是STM8当主,STM32当从(让STM8当主就是有点怪啊),这样计算的时间就省下来了,要么用两片STM8,一个当主,做计算和采样,另一个STM8当从,主要作显示和按健什么的,也是通过SPI通信 【25楼】 myworkmail
我是不赞成双CPU的./emotion/em077.gif,只是没表态。 还是用两个STM8吧!用STM32与STM8,而且让STM8当主,说不过去啊! 建议用两个STM8.一个用做ADC+FIFO,另一个处理和显示数据.这样的话,存储深度也就增加了. 硬件、软件复杂程度都增加,成本也增加,功耗也增加
仅仅是增加存储深度,这样也太划不来了
其实只要软件上分时处理好,一个STM8可以完成所有的工作了 如果用一片STM8,所能达到的采样率是不可能到芯片极限的.即便能够达到的话,会有很多时间片不能被采样到.所以如果用两片的话,对于性能来说,不是一般的提高.
因为STM8的IO比较多,所以采用并行的方式,数据传输的速度可以大大提高.同时,软件的复杂程度可以降低很多. 关于是否采用两片stm8,我觉得我们可以先做一下实验,让stm8以最大ADC速度采样,然后送LCD显示(我以为真正占用cpu资源的就这两个任务),看一个stm8是否忙得过来。
另外我还是对采用2片stm8能否提高效率保持怀疑,一个stm8仅仅是adc采样然后将采样到的数据用并行的方式发送给另一个stm8,与将采样到的数据直接送lcd显示相比,是不是要快很多?stm8没有外部数据总线,那么要通过并行方式发送和接收数据只能用软件的方式模拟,而这个和用软件方式将数据传递给LCD是不是效率差不多? 因为在显示的时候,并不是直接把拿来的数据显示到LCD上,还要进行处理,比如是否满足触发条件,采样率的情况,数据的计算等等.所以,还是用两片比较好. 【32楼】 sadf123
因此除了FIFO深度以外,其他方面,一片跟两片STM8做出来的效果是基本一样的
关键是看软件怎么处理的问题
关键在于ADC中断不是连续不断一直占用MCU的时钟。
有空余时间的。
这是做这个项目的基本前提。不然的话,即使用两片STM8也没有办法做(如果要保持数据完整性) 今天收到套件了,准备干活,ifree64,ghost2,你们这个程序大概分成几个部分,程序架构是怎么样的?每个人做什么?不是你们都分好了吧,显示都开始做了,那我做ADC吧怎么样?我以前主要是做硬件的,软件不怎么做,做的不好的地方还请你们多多指教 ifree64 ghost2 dvhome,你们最好确定一个总的流程图,这样每个人做的时候,心理就有数了,该怎么做,怎么留接口。 回myworkmail
对于软件的总流程我目前也拿不太准,现在还处于一个摸索阶段。 【36楼】 ifree64
参考一下魏坤的那个流程! 我上一个我从前做的程序供参考,环境:M8+CVAVR
点击此处下载 ourdev_430905.txt(文件大小:12K) (原文件名:dso-ks0108.txt)
反正就是看个流程吧,相关的头文件就不需要了.
页:
[1]