找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5039|回复: 20
收起左侧

STC单片机ADC差分采样或轮询采样程序如何编写?

  [复制链接]
ID:686513 发表于 2021-12-30 20:00 | 显示全部楼层 |阅读模式
本帖最后由 zhth1979 于 2022-1-4 08:52 编辑

STC  ADC轮询采样例程有吗?  采用的传感器是压阻式压力传感器,共四个脚,供电:一个正一个负,两个输出:一个正极输出,一个负极输出。有气压时,测量两个输出脚为0到60mV的变化。原有电路这两上输出脚都分别接在ADC口上。这种情况是不是要分别检测这两个脚的值,结果再相减。最好有STC8H3k系列的单片机例程参考。 22.png 1.png 2.png
回复

使用道具 举报

ID:161164 发表于 2021-12-30 23:35 | 显示全部楼层
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sfr     ADC_CONTR   =   0xbc;
  4. sfr     ADC_RES     =   0xbd;
  5. sfr     ADC_RESL    =   0xbe;
  6. sfr     ADCCFG      =   0xde;

  7. sfr     P_SW2   =   0xba;
  8. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)

  9. sfr     P0M1    =   0x93;
  10. sfr     P0M0    =   0x94;
  11. sfr     P1M1    =   0x91;
  12. sfr     P1M0    =   0x92;
  13. sfr     P2M1    =   0x95;
  14. sfr     P2M0    =   0x96;
  15. sfr     P3M1    =   0xb1;
  16. sfr     P3M0    =   0xb2;
  17. sfr     P4M1    =   0xb3;
  18. sfr     P4M0    =   0xb4;
  19. sfr     P5M1    =   0xc9;
  20. sfr     P5M0    =   0xca;
  21. bit ACD_DN;
  22. void main()
  23. {
  24.     P0M0 = 0x00;
  25.     P0M1 = 0x00;
  26.     P1M0 = 0x00;
  27.     P1M1 = 0x00;
  28.     P2M0 = 0x00;
  29.     P2M1 = 0x00;
  30.     P3M0 = 0x00;
  31.     P3M1 = 0x00;
  32.     P4M0 = 0x00;
  33.     P4M1 = 0x00;
  34.     P5M0 = 0x00;
  35.     P5M1 = 0x00;

  36.     P1M0 = 0x00;                                //设置P1.0为ADC口
  37.     P1M1 = 0x01;
  38.     P_SW2 |= 0x80;
  39.     ADCTIM = 0x3f;                              //设置ADC内部时序
  40.     P_SW2 &= 0x7f;
  41.     ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
  42.     ADC_CONTR = 0x80;                           //使能ADC模块

  43.     while (1)
  44.     {
  45.                 if(!ACD_DN)
  46.                 {
  47.                         ADC_CONTR |= 0x40;                      //启动AD转换
  48.                         _nop_();
  49.                         _nop_();
  50.                         ACD_DN = 1;
  51.                 }else{
  52.                         if(ADC_CONTR & 0x20)            //查询ADC完成标志
  53.                         {
  54.                                 ADC_CONTR &= ~0x20;                     //清完成标志
  55.                                 P2 = ADC_RES;                           //读取ADC结果
  56.                                 ACD_DN = 0;
  57.                         }                       
  58.                 }
  59.                 //Do other thing
  60.     }
  61. }

复制代码


回复

使用道具 举报

ID:313048 发表于 2021-12-31 10:40 | 显示全部楼层
差分输入采样的,可以用单片机自带的差分采样去采集,或者通过外围电路转为单信号去采集。
回复

使用道具 举报

ID:401564 发表于 2021-12-31 12:24 | 显示全部楼层
首先,你计算好没有?0-60mV的电压,对应的12位ADC,如果参考电压是5V,那么ADC的数字量是很少的
推荐用外部ADC,MCP3421这个还行,只是有点慢,但对于压力传感器来说,足够了

回复

使用道具 举报

ID:686513 发表于 2021-12-31 12:39 | 显示全部楼层
AUG 发表于 2021-12-31 10:40
差分输入采样的,可以用单片机自带的差分采样去采集,或者通过外围电路转为单信号去采集。

STC8H3k32s2单片机说明书里找了,没有自带的差分采样。
回复

使用道具 举报

ID:686513 发表于 2021-12-31 12:40 | 显示全部楼层

这是P1.0查询一次的结果吗?
回复

使用道具 举报

ID:686513 发表于 2021-12-31 12:42 | 显示全部楼层
Y_G_G 发表于 2021-12-31 12:24
首先,你计算好没有?0-60mV的电压,对应的12位ADC,如果参考电压是5V,那么ADC的数字量是很少的
推荐用外部ADC ...

参考电压为2.5V,变化是0.3mv一个PSI.
回复

使用道具 举报

ID:301191 发表于 2021-12-31 16:51 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:130230 发表于 2021-12-31 17:59 | 显示全部楼层
你要用差分输入的引脚才可以,不是为了求差。差分是为了抑制干扰,你概念理解错了。
回复

使用道具 举报

ID:624769 发表于 2021-12-31 18:09 | 显示全部楼层
zhth1979 发表于 2021-12-31 12:42
参考电压为2.5V,变化是0.3mv一个PSI.

2.5v 参考电压, 即2500mv, 0.3mv 变化即约  1/8333 的差异, 12位ADC 满量程则为 4096,可以区分 1/4096 的变化差异, 硬件上就满足不了,你也不需要考虑软件如何实现了。
回复

使用道具 举报

ID:401564 发表于 2021-12-31 18:53 | 显示全部楼层
zhth1979 发表于 2021-12-31 12:42
参考电压为2.5V,变化是0.3mv一个PSI.

就算是0.3mV一个位,那不也就200个数字量而已吗?那就是说,你不管是测量什么,最大量程只能是0-199,个人感觉这没啥用
如果一定要用这个方案,个人推荐参考电压使用2.048V,不要用2.5V
回复

使用道具 举报

ID:686513 发表于 2022-1-3 10:50 | 显示全部楼层
Y_G_G 发表于 2021-12-31 18:53
就算是0.3mV一个位,那不也就200个数字量而已吗?那就是说,你不管是测量什么,最大量程只能是0-199,个人感觉 ...

200个量就够了,实际使用到的只需要150个就够了。
回复

使用道具 举报

ID:686513 发表于 2022-1-3 10:52 | 显示全部楼层
jizhongbiao 发表于 2021-12-31 17:59
你要用差分输入的引脚才可以,不是为了求差。差分是为了抑制干扰,你概念理解错了。

这个单片机好像没有差分输入功能 ,但我看到别人同类产品,用的单片机也没有差分功能,用了两个ADC口,不知道如何实现的。
回复

使用道具 举报

ID:686513 发表于 2022-1-3 10:58 | 显示全部楼层
jizhongbiao 发表于 2021-12-31 17:59
你要用差分输入的引脚才可以,不是为了求差。差分是为了抑制干扰,你概念理解错了。

两个结果求差的结果和(ADC1-GND)-(ADC2-GND)不是一样吗?
回复

使用道具 举报

ID:401564 发表于 2022-1-3 18:48 | 显示全部楼层
传感器的1脚接ADC的地,单片机上面的AGnd,3脚接到一个ADC,这应该就可以了
然后进行ADC看一下结果 51hei截图20220103184623.png

回复

使用道具 举报

ID:686513 发表于 2022-1-4 08:51 | 显示全部楼层
Y_G_G 发表于 2022-1-3 18:48
传感器的1脚接ADC的地,单片机上面的AGnd,3脚接到一个ADC,这应该就可以了
然后进行ADC看一下结果

这样接不就是单端输入了吗?传感器部分按样板线路已经做好了。
回复

使用道具 举报

ID:301191 发表于 2022-1-6 04:40 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:82067 发表于 2022-1-7 15:34 | 显示全部楼层
还是用放大器放大一下吧,这个太小了,测不了
回复

使用道具 举报

ID:313048 发表于 2022-1-7 16:26 | 显示全部楼层
zhth1979 发表于 2021-12-31 12:39
STC8H3k32s2单片机说明书里找了,没有自带的差分采样。

用运放吖,芯片没有就用运放,运放差分放大就可以了,只用单片机1个IO
回复

使用道具 举报

ID:625730 发表于 2022-1-14 17:11 | 显示全部楼层
zhth1979 发表于 2022-1-4 08:51
这样接不就是单端输入了吗?传感器部分按样板线路已经做好了。

传感器有说明书吧?可以参考推荐的电路,很多Vout-接地就可以用了,单端也不是不可以。
回复

使用道具 举报

ID:169891 发表于 2022-1-27 16:17 | 显示全部楼层
Y_G_G 发表于 2022-1-3 18:48
传感器的1脚接ADC的地,单片机上面的AGnd,3脚接到一个ADC,这应该就可以了
然后进行ADC看一下结果

这个没看懂啊,ADC的地和AGnd不是一个地吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表