亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1486|回復: 14
打印 上一主題 下一主題
收起左側

STC8G1K08 ADC問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1146155 發表于 2025-11-26 17:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一路ADC已經讀取內部的LDO的電壓1.19V,但是我還想使用另外一路讀取傳感器的模擬值。如何多路ADC同步進行!原理和程序實現
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1153607 發表于 2025-11-27 08:26 | 只看該作者
STC老妖的庫里有現成的歷程,拿去用就是了。
回復

使用道具 舉報

板凳
ID:1153607 發表于 2025-11-27 08:31 | 只看該作者
“同步進行”是做不到的,只能是按照順序一個個的進行。一定要同步進行ADC使用專用芯片或者干脆幾片CPU同步工作進行。
回復

使用道具 舉報

地板
ID:712493 發表于 2025-11-27 09:15 | 只看該作者
大部分的MCU就只有一個ADC轉換模塊,外面多路IO有ADC輸入只是通過內部電子開關切換而已!
回復

使用道具 舉報

5#
ID:879809 發表于 2025-11-27 11:26 | 只看該作者
一個ADC不可能實現理想的“同步”,分別切換采樣轉換能看上去是“同步”的。內部LDO電壓采集一次就足夠了,用來標定傳感器電壓,同步毫無意義。
回復

使用道具 舉報

6#
ID:327265 發表于 2025-11-27 11:36 | 只看該作者
輪詢切換采集
回復

使用道具 舉報

7#
ID:712493 發表于 2025-11-27 15:17 | 只看該作者
weisc6955 發表于 2025-11-27 08:31
“同步進行”是做不到的,只能是按照順序一個個的進行。一定要同步進行ADC使用專用芯片或者干脆幾片CPU同步 ...

看手冊  專用ADC芯片大多也只有2個轉換模塊!
回復

使用道具 舉報

8#
ID:712493 發表于 2025-11-27 15:19 | 只看該作者
rundstedt 發表于 2025-11-27 11:26
一個ADC不可能實現理想的“同步”,分別切換采樣轉換能看上去是“同步”的。內部LDO電壓采集一次就足夠了, ...

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

使用道具 舉報

9#
ID:712493 發表于 2025-11-27 15:22 | 只看該作者

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

使用道具 舉報

10#
ID:879809 發表于 2025-11-27 16:15 | 只看該作者
fj51hei 發表于 2025-11-27 15:19
讀內部LDO實際是反向讀取 MCU的VDD電壓值,由于VDD理論是可變的,所以讀一次是不行的

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

使用道具 舉報

11#
ID:1133081 發表于 2025-11-27 21:21 | 只看該作者
用串口助手觀察結果,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;//內部1.19V參考信號源值
  8. uint res;//讀取內部第15通道ADC結果
  9. uint VCC;//電源電壓
  10. uint VCA;//緩沖
  11. uint Vin;//被測電壓
  12. uint VADC;//ADC轉換結果
  13. uint count;//計數
  14. bit flag;//T0中斷標志
  15. bit busy;//串口發送標志

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

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

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

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

  64. void main()
  65. {
  66.         uchar i;
  67.         P0M0 = 0xff;       //設置P0為推挽口
  68.         P0M1 = 0x00;
  69.         P1M0 = 0x00;       //設置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;//內部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結果
  91.                         VCC = (int)(4096L * *BGV / res);//計算電源電壓
  92.                         VCA=VCC;
  93.                         for(i=0;i<4;i++)//數據分解存入緩存地址前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結果
  101.                         Vin=VCC*(ulong)VADC/4096;//計算輸入電壓
  102.                         for(i=0;i<4;i++)//數據分解存入緩存地址后4
  103.                         {
  104.                                 dis_buf[7-i]=Vin%10;
  105.                                 Vin/=10;
  106.                         }
  107.                         for(i=0;i<8;i++)//串口發送數據
  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發送中斷
  126.         {
  127.                 TI = 0;                        //清除串口1發送中斷請求位
  128.                 busy = 0;
  129.         }
  130.         if (RI)                                //檢測串口1接收中斷
  131.         {
  132.                 RI = 0;                        //清除串口1接收中斷請求位
  133.         }
  134. }
復制代碼



回復

使用道具 舉報

12#
ID:1146155 發表于 2025-11-28 18:33 | 只看該作者
fj51hei 發表于 2025-11-27 15:22
多個ADC通道需要采集確實不是很好安排順序的,而且多個ADC通道采集其響應速度會低很多!

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

使用道具 舉報

13#
ID:1146155 發表于 2025-11-28 18:36 | 只看該作者
發表于 2025-11-27 11:36
輪詢切換采集

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

使用道具 舉報

14#
ID:1146155 發表于 2025-11-28 18:37 | 只看該作者
WL0123 發表于 2025-11-27 21:21
用串口助手觀察結果,mV。

謝謝大佬
回復

使用道具 舉報

15#
ID:1146155 發表于 2025-11-28 18:48 | 只看該作者
感謝各位大佬的回復
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表