• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

AD采样速率和串口波特率不同的情况下,如何编写单片机程序呢?

比如说

AD采样的速率是800个点/秒,每个点是一个16bit数据。

波特率肯定要大于采样速率,设为19200波特率,19200/16=1200个数据。

差这400个数据怎么处理呢?

就是说如何实时的实现变采边传,互不影响。

全部回复(9)
正序查看
倒序查看
cltwolf
LV.5
2
2014-05-15 11:24

不太明白你说的。

第一,所谓的实时,其实是有延时的,只是我们感觉不出来而已。1MS的采样时间和10uS的采样时间不用相关的技术、仪器或者设备,人的感觉是感觉不出来的。所以,你把采集到的数据传输走,再进行采样,差不多也是实时了。

第二,我们现在的AD采样不都是有ADC寄存器的吗?采样过程这个寄存器是读取不了的吧?如果真读取不了,那么,边采样边传输其实也要等ADC中断触发后才能传输和重新采样吧?

最后,波特率越高,对时序及硬件设计要求越高,小心为上。

0
回复
2014-05-15 11:37
@cltwolf
不太明白你说的。第一,所谓的实时,其实是有延时的,只是我们感觉不出来而已。1MS的采样时间和10uS的采样时间不用相关的技术、仪器或者设备,人的感觉是感觉不出来的。所以,你把采集到的数据传输走,再进行采样,差不多也是实时了。第二,我们现在的AD采样不都是有ADC寄存器的吗?采样过程这个寄存器是读取不了的吧?如果真读取不了,那么,边采样边传输其实也要等ADC中断触发后才能传输和重新采样吧?最后,波特率越高,对时序及硬件设计要求越高,小心为上。
实时是不可能的,采样会有延时,串口发送也会有延时!
0
回复
2014-05-15 12:48
@cltwolf
不太明白你说的。第一,所谓的实时,其实是有延时的,只是我们感觉不出来而已。1MS的采样时间和10uS的采样时间不用相关的技术、仪器或者设备,人的感觉是感觉不出来的。所以,你把采集到的数据传输走,再进行采样,差不多也是实时了。第二,我们现在的AD采样不都是有ADC寄存器的吗?采样过程这个寄存器是读取不了的吧?如果真读取不了,那么,边采样边传输其实也要等ADC中断触发后才能传输和重新采样吧?最后,波特率越高,对时序及硬件设计要求越高,小心为上。

我的意思是19200波特率意味着1秒钟必须发送2400个字节出去。

而每秒AD采集到的数据并没有2400个字节,只有1600个字节。

而单片机的数据空间有限,我也不想扩展,因此先将我需要的点存入数据空间,然后最后再传输是不可能的。

因此我的意思呢就是采1个字节,传1个字节,有延时没关系。

每秒串口传输的2400个字节大于AD采到的1600个字节。这时就有800个字节的裕量。

就是说采的慢,传的快。

我画了一个示意图:

我画问号的地方,实际上是没有数据要发送的。这些问号应该填充什么?

0
回复
2014-05-15 13:35
@ericjackson05
我的意思是19200波特率意味着1秒钟必须发送2400个字节出去。而每秒AD采集到的数据并没有2400个字节,只有1600个字节。而单片机的数据空间有限,我也不想扩展,因此先将我需要的点存入数据空间,然后最后再传输是不可能的。因此我的意思呢就是采1个字节,传1个字节,有延时没关系。每秒串口传输的2400个字节大于AD采到的1600个字节。这时就有800个字节的裕量。就是说采的慢,传的快。我画了一个示意图:[图片]我画问号的地方,实际上是没有数据要发送的。这些问号应该填充什么?
这个可以,直接用扫描的方式就好了,不要用定时器这些,让程序自己顺序循环执行就好!
0
回复
2014-05-15 14:07
@ericjackson05
我的意思是19200波特率意味着1秒钟必须发送2400个字节出去。而每秒AD采集到的数据并没有2400个字节,只有1600个字节。而单片机的数据空间有限,我也不想扩展,因此先将我需要的点存入数据空间,然后最后再传输是不可能的。因此我的意思呢就是采1个字节,传1个字节,有延时没关系。每秒串口传输的2400个字节大于AD采到的1600个字节。这时就有800个字节的裕量。就是说采的慢,传的快。我画了一个示意图:[图片]我画问号的地方,实际上是没有数据要发送的。这些问号应该填充什么?

光看标题,没有看懂,进来看讨论后,明白了,不知道是什么样的系统需要这样用串口来实施传输A/D采样,一般人家是A/D采样后,单片机处理完再用通讯直接传输结果(上述意思是通常没必要直接传输每个点的A/D数据);如果是必须采用这种方式(不常见),那么也能正常执行(相对而言通讯是慢速,不能进行实时控制的),回复你4帖的问题,在波特率是19200的情况下,不能保证一次不丢码,如果每次确认都接收OK的话,串口多余的时间等着,如果出现丢码,就重新发送!

0
回复
cltwolf
LV.5
7
2014-05-15 21:55
@ericjackson05
我的意思是19200波特率意味着1秒钟必须发送2400个字节出去。而每秒AD采集到的数据并没有2400个字节,只有1600个字节。而单片机的数据空间有限,我也不想扩展,因此先将我需要的点存入数据空间,然后最后再传输是不可能的。因此我的意思呢就是采1个字节,传1个字节,有延时没关系。每秒串口传输的2400个字节大于AD采到的1600个字节。这时就有800个字节的裕量。就是说采的慢,传的快。我画了一个示意图:[图片]我画问号的地方,实际上是没有数据要发送的。这些问号应该填充什么?

呃,我有点晕了。

第一:串口不是一直在工作的,而是你有数据传输的时候才会去启动它的。

第二:波特率是速度,不是量度。它是一秒钟传输速度可以达到2400个字节,不是说必须一定要2400个字节。就像一条短程高速公路,速度上限是120公里每小时,整条高速公路有三车道,但不一定每段200米内的三车道都有120公里每小时的车在走,也可以是一辆,或者更本没车在走。

当你把数据装载到串口寄存器,发送完了,它也就停止了,空数据的地方它根本不会理你,更别说发送了。你想想,像你说的,它每秒钟都要发送2400字节的数据,那么除非它的send寄存器有自动清零功能,不然,在你装载入下个数据之前,它一直送的是前面你送的这个数据。那你的接收端的receive寄存器的门不得给数据扣爆了。一秒钟,串口中断2400次,你MCU内核主频如果不够大,直接死给你看。

另外,有个建议,就是你这串口如果只是用来传AD数据而不是其他大数据包的话,真没必要这么大,2400左右就可以了。这速度已经可以让你感觉到实时了,也不会让ADC芯片数据需要堆栈的。让MCU多休息,品质会提高。频率减小了,时序出错的几率也减小了,品质也会提高。同时,功耗可以降低。

0
回复
2014-05-15 22:29
@cltwolf
呃,我有点晕了。第一:串口不是一直在工作的,而是你有数据传输的时候才会去启动它的。第二:波特率是速度,不是量度。它是一秒钟传输速度可以达到2400个字节,不是说必须一定要2400个字节。就像一条短程高速公路,速度上限是120公里每小时,整条高速公路有三车道,但不一定每段200米内的三车道都有120公里每小时的车在走,也可以是一辆,或者更本没车在走。当你把数据装载到串口寄存器,发送完了,它也就停止了,空数据的地方它根本不会理你,更别说发送了。你想想,像你说的,它每秒钟都要发送2400字节的数据,那么除非它的send寄存器有自动清零功能,不然,在你装载入下个数据之前,它一直送的是前面你送的这个数据。那你的接收端的receive寄存器的门不得给数据扣爆了。一秒钟,串口中断2400次,你MCU内核主频如果不够大,直接死给你看。另外,有个建议,就是你这串口如果只是用来传AD数据而不是其他大数据包的话,真没必要这么大,2400左右就可以了。这速度已经可以让你感觉到实时了,也不会让ADC芯片数据需要堆栈的。让MCU多休息,品质会提高。频率减小了,时序出错的几率也减小了,品质也会提高。同时,功耗可以降低。

了解,解释的清晰明了!非常感谢!

我是要采集一个系统里面某电容充电时的两端电压,这个电容充电的时间也就0.5s左右,所以需要用单片机AD的最高速度采,采完以后立刻发送出去

0
回复
cltwolf
LV.5
9
2014-05-17 00:04
@ericjackson05
了解,解释的清晰明了!非常感谢!我是要采集一个系统里面某电容充电时的两端电压,这个电容充电的时间也就0.5s左右,所以需要用单片机AD的最高速度采,采完以后立刻发送出去

哦,电容采样啊,那确实需要高一点的波特率,而且,采样速度和精度都要考虑做到合适电容充电时间内可以用的条件下,性价比最高;难度有点,可以看看示波器是怎么做的当然,CPU考虑16位以上的吧。

0
回复
kcfoo1
LV.5
10
2014-06-18 09:46
@cltwolf
哦,电容采样啊,那确实需要高一点的波特率,而且,采样速度和精度都要考虑做到合适电容充电时间内可以用的条件下,性价比最高;难度有点,可以看看示波器是怎么做的当然,CPU考虑16位以上的吧。
这个可以ad中断和rs串口发射中断,只需要占用很少的控制时间,至于ad采集速率那就得看你对精度的要求了,
0
回复