欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 560|回復(fù): 14
收起左側(cè)

STC8G1K08 ADC問題

[復(fù)制鏈接]
ID:1146155 發(fā)表于 2025-11-26 17:33 | 顯示全部樓層 |閱讀模式
一路ADC已經(jīng)讀取內(nèi)部的LDO的電壓1.19V,但是我還想使用另外一路讀取傳感器的模擬值。如何多路ADC同步進行!原理和程序?qū)崿F(xiàn)
回復(fù)

使用道具 舉報

ID:1153607 發(fā)表于 2025-11-27 08:26 | 顯示全部樓層
STC老妖的庫里有現(xiàn)成的歷程,拿去用就是了。
回復(fù)

使用道具 舉報

ID:1153607 發(fā)表于 2025-11-27 08:31 | 顯示全部樓層
“同步進行”是做不到的,只能是按照順序一個個的進行。一定要同步進行ADC使用專用芯片或者干脆幾片CPU同步工作進行。
回復(fù)

使用道具 舉報

ID:712493 發(fā)表于 2025-11-27 09:15 | 顯示全部樓層
大部分的MCU就只有一個ADC轉(zhuǎn)換模塊,外面多路IO有ADC輸入只是通過內(nèi)部電子開關(guān)切換而已!
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2025-11-27 11:26 | 顯示全部樓層
一個ADC不可能實現(xiàn)理想的“同步”,分別切換采樣轉(zhuǎn)換能看上去是“同步”的。內(nèi)部LDO電壓采集一次就足夠了,用來標(biāo)定傳感器電壓,同步毫無意義。
回復(fù)

使用道具 舉報

ID:327265 發(fā)表于 2025-11-27 11:36 | 顯示全部樓層
輪詢切換采集
回復(fù)

使用道具 舉報

ID:712493 發(fā)表于 2025-11-27 15:17 | 顯示全部樓層
weisc6955 發(fā)表于 2025-11-27 08:31
“同步進行”是做不到的,只能是按照順序一個個的進行。一定要同步進行ADC使用專用芯片或者干脆幾片CPU同步 ...

看手冊  專用ADC芯片大多也只有2個轉(zhuǎn)換模塊!
回復(fù)

使用道具 舉報

ID:712493 發(fā)表于 2025-11-27 15:19 | 顯示全部樓層
rundstedt 發(fā)表于 2025-11-27 11:26
一個ADC不可能實現(xiàn)理想的“同步”,分別切換采樣轉(zhuǎn)換能看上去是“同步”的。內(nèi)部LDO電壓采集一次就足夠了, ...

讀內(nèi)部LDO實際是反向讀取 MCU的VDD電壓值,由于VDD理論是可變的,所以讀一次是不行的
回復(fù)

使用道具 舉報

ID:712493 發(fā)表于 2025-11-27 15:22 | 顯示全部樓層

多個ADC通道需要采集確實不是很好安排順序的,而且多個ADC通道采集其響應(yīng)速度會低很多!
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2025-11-27 16:15 | 顯示全部樓層
fj51hei 發(fā)表于 2025-11-27 15:19
讀內(nèi)部LDO實際是反向讀取 MCU的VDD電壓值,由于VDD理論是可變的,所以讀一次是不行的

VDD理論上是不可能劇烈變化的,只會緩慢漂移,1分鐘甚至10分鐘測一次都沒問題。
回復(fù)

使用道具 舉報

ID:1133081 發(fā)表于 2025-11-27 21:21 | 顯示全部樓層
用串口助手觀察結(jié)果,mV。
  1. #include "STC8G.H"
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ulong unsigned long

  6. uchar data dis_buf[8];
  7. int *BGV;//內(nèi)部1.19V參考信號源值
  8. uint res;//讀取內(nèi)部第15通道ADC結(jié)果
  9. uint VCC;//電源電壓
  10. uint VCA;//緩沖
  11. uint Vin;//被測電壓
  12. uint VADC;//ADC轉(zhuǎn)換結(jié)果
  13. uint count;//計數(shù)
  14. bit flag;//T0中斷標(biāo)志
  15. bit busy;//串口發(fā)送標(biāo)志

  16. void Uart1_Init(void)        //115200bps@11.0592MHz
  17. {
  18.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  19.         AUXR |= 0x40;                //定時器時鐘1T模式
  20.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  21.         TMOD &= 0x0F;                //設(shè)置定時器模式
  22.         TL1 = 0xE8;                        //設(shè)置定時初始值
  23.         TH1 = 0xFF;                        //設(shè)置定時初始值
  24.         ET1 = 0;                        //禁止定時器中斷
  25.         TR1 = 1;                        //定時器1開始計時
  26.         ES = 1;                                //使能串口1中斷
  27. }

  28. void UartSend(char dat)
  29. {
  30.     while (busy);//等待中斷復(fù)位
  31.     busy = 1;
  32.     SBUF = dat;
  33. }

  34. //初始化ADC
  35. void ADC_Init(void)
  36. {
  37.         P_SW2 |= 0x80;
  38.         ADCTIM = 0x3f;         //設(shè)置ADC內(nèi)部時序
  39.         P_SW2 &= 0x7f;
  40.         ADCCFG = 0x2f;         //設(shè)置ADC時鐘為系統(tǒng)時鐘/2/16,12位結(jié)果右對齊
  41.         ADC_CONTR = 0x80;      //使能ADC模塊
  42. }
  43. //讀取ADC結(jié)果
  44. uint ADC_Read(uchar ch)
  45. {
  46.         ADC_CONTR = ch;                          //啟動AD轉(zhuǎn)換
  47.         _nop_();
  48.         _nop_();
  49.         while (!(ADC_CONTR & 0x20));                //查詢ADC完成標(biāo)志
  50.         ADC_CONTR &= ~0x20;                         //清完成標(biāo)志
  51.         return ADC_RES << 8 | ADC_RESL;         //返回12位ADC結(jié)果
  52. }

  53. void Timer0_Init(void)                //2毫秒@11.0592MHz
  54. {
  55.         AUXR |= 0x80;                        //定時器時鐘1T模式
  56.         TMOD &= 0xf0;                        //設(shè)置定時器模式
  57.         TL0 = 0x9A;                                //設(shè)置定時初始值
  58.         TH0 = 0xA9;                                //設(shè)置定時初始值
  59.         TF0 = 0;                                //清除TF0標(biāo)志
  60.         TR0 = 1;                                //定時器0開始計時
  61.         ET0 = 1;                                //使能定時器0中斷
  62.         EA  = 1;                          //使能總中斷
  63. }

  64. void main()
  65. {
  66.         uchar i;
  67.         P0M0 = 0xff;       //設(shè)置P0為推挽口
  68.         P0M1 = 0x00;
  69.         P1M0 = 0x00;       //設(shè)置P1.0為ADC口
  70.         P1M1 = 0x80;
  71.         P2M0 = 0x00;
  72.         P2M1 = 0x00;
  73.         P3M0 = 0x00;
  74.         P3M1 = 0x00;
  75.         P4M0 = 0x00;
  76.         P4M1 = 0x00;
  77.         P5M0 = 0x00;
  78.         P5M1 = 0x00;
  79.         BGV = (int idata *)0xef;//內(nèi)部1.19V參考信號源值
  80.         ADC_Init();
  81.         Uart1_Init();
  82.         Timer0_Init();
  83.         while (1)
  84.         {
  85.                 if(flag)
  86.                 {
  87.                         flag=0;
  88.                         ADC_Read(0xcf);//丟掉兩次檢測
  89.                         ADC_Read(0xcf);
  90.                         res=ADC_Read(0xcf);   //讀取第15通道ADC結(jié)果
  91.                         VCC = (int)(4096L * *BGV / res);//計算電源電壓
  92.                         VCA=VCC;
  93.                         for(i=0;i<4;i++)//數(shù)據(jù)分解存入緩存地址前4
  94.                         {
  95.                                 dis_buf[3-i]=VCA%10;
  96.                                 VCA/=10;
  97.                         }
  98.                         ADC_Read(0xc7);//丟掉兩次檢測
  99.                         ADC_Read(0xc7);
  100.                         VADC=ADC_Read(0xc7);   //讀取第7通道ADC結(jié)果
  101.                         Vin=VCC*(ulong)VADC/4096;//計算輸入電壓
  102.                         for(i=0;i<4;i++)//數(shù)據(jù)分解存入緩存地址后4
  103.                         {
  104.                                 dis_buf[7-i]=Vin%10;
  105.                                 Vin/=10;
  106.                         }
  107.                         for(i=0;i<8;i++)//串口發(fā)送數(shù)據(jù)
  108.                         {
  109.                                 UartSend(dis_buf[i]+'0');
  110.                         }                       
  111.                 }
  112.         }
  113. }
  114. //
  115. void Timer0_Isr(void) interrupt 1
  116. {
  117.         if(++count>=500)
  118.         {
  119.                 count=0;
  120.                 flag=1;
  121.         }
  122. }

  123. void Uart1_Isr(void) interrupt 4
  124. {
  125.         if (TI)                                //檢測串口1發(fā)送中斷
  126.         {
  127.                 TI = 0;                        //清除串口1發(fā)送中斷請求位
  128.                 busy = 0;
  129.         }
  130.         if (RI)                                //檢測串口1接收中斷
  131.         {
  132.                 RI = 0;                        //清除串口1接收中斷請求位
  133.         }
  134. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:1146155 發(fā)表于 2025-11-28 18:33 | 顯示全部樓層
fj51hei 發(fā)表于 2025-11-27 15:22
多個ADC通道需要采集確實不是很好安排順序的,而且多個ADC通道采集其響應(yīng)速度會低很多!

但是我發(fā)現(xiàn)在主函數(shù)while(1)中使用串口打印沒問題,如果加入了188數(shù)碼管的顯示程序,那么串口就打不出來!程序是順序執(zhí)行的,不知道是為什么
回復(fù)

使用道具 舉報

ID:1146155 發(fā)表于 2025-11-28 18:36 | 顯示全部樓層

假如我想讀1ADC0通道(初始化-讀)這個過程完了以后。我再想讀ADC1通道(初始化-讀),程序上是whlie(1){(ADC0初始化-讀);(ADC1初始化-讀初始化-讀);(ADC2初始化-讀初始化-讀); ..................;}是這樣組合的嗎,
回復(fù)

使用道具 舉報

ID:1146155 發(fā)表于 2025-11-28 18:37 | 顯示全部樓層
WL0123 發(fā)表于 2025-11-27 21:21
用串口助手觀察結(jié)果,mV。

謝謝大佬
回復(fù)

使用道具 舉報

ID:1146155 發(fā)表于 2025-11-28 18:48 | 顯示全部樓層
感謝各位大佬的回復(fù)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表