久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

基于FwLib_STC8的模數(shù)轉(zhuǎn)換ADC介紹和演示用例說明

[復(fù)制鏈接]
ID:912806 發(fā)表于 2022-1-10 01:04 | 顯示全部樓層 |閱讀模式
本帖最后由 michaelchain 于 2022-1-10 01:10 編輯

STC8G和STC8H的ADC部分在寄存器設(shè)置上基本上一致, 但是不同型號(hào)對(duì)應(yīng)的通道編號(hào), 通道數(shù)量和精度有區(qū)別

通道數(shù)量和精度
對(duì)應(yīng)STC8G/STC8H的各個(gè)系列的通道數(shù)量和精度如下.
[td]
產(chǎn)品線ADC 分辨率ADC 通道數(shù)
STC8H1K08 系列10 位9 通道
STC8H1K28 系列10 位12 通道
STC8H3K64S4 系列12 位12 通道
STC8H3K64S2 系列12 位12 通道
STC8H8K64U 系列12 位15 通道
STC8H2K64T 系列12 位15 通道
STC8H4K64TLR 系列12 位15 通道
STC8H4K64TLCD 系列12 位15 通道
STC8H4K64LCD 系列12 位15 通道

通道的選擇使用寄存器ADC_CONTR的低4位, 對(duì)應(yīng)STC8G/STC8H的各個(gè)系列, 這個(gè)寄存器的數(shù)值對(duì)應(yīng)的通道如下
[td]
STC8H1K28STC8H1K08STC8H3K64S4
STC8H3K64S2
STC8H8K64U
STC8H2K64T
STC8H4K64TLR
STC8H4K64TLCD
STC8H4K64LCD
STC8G1K08ASTC8G1K08
STC8G1K08T
STC8G2K64S4
STC8G2K64S2
0000P1.0/ADC0P1.0/ADC0P1.0/ADC0P1.0/ADC0P1.0/ADC0P3.0/ADC0P1.0/ADC0P1.0/ADC0
0001P1.1/ADC1P1.1/ADC1P1.1/ADC1P1.1/ADC1P1.1/ADC1P3.1/ADC1P1.1/ADC1P1.1/ADC1
0010P1.2/ADC2N/AP1.2/ADC2P5.4/ADC2P5.4/ADC2P3.2/ADC2P1.2/ADC2P1.2/ADC2
0011P1.3/ADC3N/AN/AP1.3/ADC3P1.3/ADC3P3.3/ADC3P1.3/ADC3P1.3/ADC3
0100P1.4/ADC4N/AN/AP1.4/ADC4P1.4/ADC4P5.4/ADC4P1.4/ADC4P1.4/ADC4
0101P1.5/ADC5N/AN/AP1.5/ADC5P1.5/ADC5P5.5/ADC5P1.5/ADC5P1.5/ADC5
0110P1.6/ADC6N/AP1.6/ADC6P1.6/ADC6P6.2/ADC6N/AP1.6/ADC6P1.6/ADC6
0111P1.7/ADC7N/AP1.7/ADC7P1.7/ADC7P6.3/ADC7N/AP1.7/ADC7P1.7/ADC7
1000P0.0/ADC8P3.0/ADC8P0.0/ADC8P0.0/ADC8P0.0/ADC8N/AP3.0/ADC8P0.0/ADC8
1001P0.1/ADC9P3.1/ADC9P0.1/ADC9P0.1/ADC9P0.1/ADC9N/AP3.1/ADC9P0.1/ADC9
1010P0.2/ADC10P3.2/ADC10P0.2/ADC10P0.2/ADC10P0.2/ADC10N/AP3.2/ADC10P0.2/ADC10
1011P0.3/ADC11P3.3/ADC11P0.3/ADC11P0.3/ADC11P0.3/ADC11N/AP3.3/ADC11P0.3/ADC11
1100N/AP3.4/ADC12P0.4/ADC12P0.4/ADC12P0.4/ADC12N/AP3.4/ADC12P0.4/ADC12
1101N/AP3.5/ADC13P0.5/ADC13P0.5/ADC13P0.5/ADC13N/AP3.5/ADC13P0.5/ADC13
1110N/AP3.6/ADC14P0.6/ADC14P0.6/ADC14P0.6/ADC14N/AP3.6/ADC14P0.6/ADC14
11111.19Vref1.19Vref1.19Vref1.19Vref1.19Vref1.19Vref1.19Vref1.19Vref

轉(zhuǎn)換結(jié)果的對(duì)齊格式

ADC采樣的精度實(shí)際上是不能設(shè)置的, 采樣都是用的當(dāng)前型號(hào)的最大精度, 結(jié)果存儲(chǔ)在[ADC_RES, ADC_RESL]這兩個(gè)寄存器. 為方便不同場(chǎng)合使用不同精度的結(jié)果, 可以將結(jié)果設(shè)置為左對(duì)齊或右對(duì)齊.
  • 當(dāng)設(shè)置為左對(duì)齊時(shí), 可以只取ADC_RES的值(8位), 忽略最后兩位.
  • 當(dāng)設(shè)置位右對(duì)齊時(shí), 根據(jù)實(shí)際的精度, 可以取ADC_RES的低4位(12位精度)或低2位(10位精度), 加上ADC_RESL得到最終結(jié)果.


轉(zhuǎn)換的時(shí)間消耗

一個(gè)完整的 ADC 轉(zhuǎn)換時(shí)間為 = Tsetup + Tduty + Thold + Tconvert
  • Tsetup: 轉(zhuǎn)換的通道切換時(shí)間, 可以設(shè)置為1個(gè)或2個(gè)ADC時(shí)鐘周期
  • Tduty: 轉(zhuǎn)換的采樣時(shí)間, 默認(rèn)是最低的11個(gè)ADC時(shí)鐘, 最高為32個(gè)ADC時(shí)鐘周期
  • Thold: 通道選擇的保持時(shí)間, 可以選擇1, 2, 3, 4個(gè)ADC時(shí)鐘周期
  • Tconvert: 轉(zhuǎn)換時(shí)間是固定的, 10bit精度是10個(gè)ADC時(shí)鐘, 12bit精度是12個(gè)ADC時(shí)鐘


以上的時(shí)間單位都是ADC時(shí)鐘周期, 每個(gè)ADC時(shí)鐘周期占用系統(tǒng)時(shí)鐘(SYSCLK)的數(shù)量是可以設(shè)置的, 使用ADCCFG寄存器的低三位, 可以設(shè)置為最低2個(gè)系統(tǒng)時(shí)鐘周期到最高32個(gè)系統(tǒng)時(shí)鐘周期
對(duì)于轉(zhuǎn)換的最高頻率, DS上寫了全局限制

  • 10 位 ADC 的速度不能高于 500KHz
  • 12 位 ADC 的速度不能高于 800KHz
  • 轉(zhuǎn)換的采樣時(shí)間不能小于 10,建議設(shè)置為 15



硬件連線

STC8G/STC8H的ADC硬件連線有兩種: 帶AVcc,AGrnd和不帶AVcc,AGrnd

帶 AVcc,AGrnd

高端型號(hào)STC8H3K64S2系列, 例如會(huì)帶這兩個(gè)pin腳, 分別對(duì)應(yīng)的是轉(zhuǎn)換目標(biāo)的電壓參考值和對(duì)地參考值. 對(duì)于普通使用, 這兩個(gè)可以直接接到VCC和GND, 連線為
  1.    AGrnd   -> GND
  2.    AVcc    -> VCC
  3.    AVref   -> VCC
  4.    Vcc     -> VCC
  5.    Gnd     -> GND
  6.    ADC1    -> 采樣點(diǎn)
復(fù)制代碼

不帶 AVcc,AGrnd

低端型號(hào)以及STC8G系列不帶這兩個(gè)pin, 只需要接AVref, 采樣點(diǎn)與MCU共地連接, 連線為
  1.    AVref   -> VCC
  2.    Vcc     -> VCC
  3.    Gnd     -> GND
  4.    ADC1    -> Test voltage
復(fù)制代碼

演示用例說明

以下演示用例, 基于 FwLib_STC8, 源代碼位于 FwLib_STC8/demo/adc 目錄, 可以自行下載或查看. 因?yàn)榘姹狙葑? 代碼可能與倉(cāng)庫(kù)中的代碼有出入, 以倉(cāng)庫(kù)中的最新版本為準(zhǔn).

關(guān)于如何運(yùn)行演示用例, 可以參考前面介紹的Keil C51和VSCode PlatformIO的配置說明

使用ADC1進(jìn)行8位ADC轉(zhuǎn)換, 主動(dòng)查詢(polling)方式

下面的例子, 使用主動(dòng)查詢的方式每隔0.1秒對(duì)P1.1口進(jìn)行ADC轉(zhuǎn)換, 精度8位, 將結(jié)果輸出至串口
main.c代碼
  1. #include "fw_hal.h"

  2. void main(void)
  3. {
  4.     uint8_t res;
  5.     // 調(diào)整系統(tǒng)頻率, 如果使用STC-ISP設(shè)定頻率, 需要將這行注釋掉
  6.     SYS_SetClock();
  7.     // 用于結(jié)果輸出
  8.     UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
  9.     // 將 ADC1(GPIO P1.1) 設(shè)為高阻輸入
  10.     GPIO_P1_SetMode(GPIO_Pin_1, GPIO_Mode_Input_HIP);
  11.     // 使用通道: ADC1
  12.     ADC_SetChannel(0x01);
  13.     // 設(shè)置ADC時(shí)鐘 = SYSCLK / 2 / (1+1) = SYSCLK / 4
  14.     ADC_SetClockPrescaler(0x01);
  15.     // 設(shè)置結(jié)果左對(duì)齊, 只需要取值 ADC_RES
  16.     ADC_SetResultAlignmentLeft();
  17.     // 開啟ADC電源
  18.     ADC_SetPowerState(HAL_State_ON);

  19.     while(1)
  20.     {
  21.         // 開始轉(zhuǎn)換
  22.         ADC_Start();
  23.         // 等待兩個(gè)系統(tǒng)時(shí)鐘
  24.         NOP();
  25.         NOP();
  26.         // 檢查轉(zhuǎn)換結(jié)果標(biāo)志位是否置位
  27.         while (!ADC_SamplingFinished());
  28.         // 清除結(jié)果標(biāo)志位
  29.         ADC_ClearInterrupt();
  30.         // 讀取結(jié)果
  31.         res = ADC_RES;

  32.         // 通過串口1輸出
  33.         UART1_TxString("Result: ");
  34.         UART1_TxHex(res);
  35.         UART1_TxString("\r\n");
  36.         // 等待100ms后再次進(jìn)行轉(zhuǎn)換
  37.         SYS_Delay(100);
  38.     }
  39. }
復(fù)制代碼


使用ADC1進(jìn)行10位/12位ADC轉(zhuǎn)換, 中斷(interrupt)方式

下面的例子, 使用中斷的方式對(duì)P1.1口進(jìn)行ADC連續(xù)轉(zhuǎn)換, 精度10位(或12位, MCU型號(hào)不同精度不同), 每隔0.1秒將結(jié)果輸出至串口
  1. #include "fw_hal.h"

  2. // 16位變量用于記錄轉(zhuǎn)換結(jié)果
  3. uint16_t res;

  4. // 處理中斷的方法, 使用宏定義保證Keil C51和SDCC的兼容性
  5. INTERRUPT(ADC_Routine, EXTI_VectADC)
  6. {
  7.     // 先清除中斷位
  8.     ADC_ClearInterrupt();
  9.     // 結(jié)果低8位
  10.     res = ADC_RESL;
  11.     // 結(jié)果高8位
  12.     res |= (ADC_RES & 0x0F) << 8;
  13.     // 再次啟動(dòng), 使得ADC連續(xù)轉(zhuǎn)換,
  14.     ADC_Start();
  15. }

  16. void main(void)
  17. {
  18.     // 設(shè)置系統(tǒng)頻率
  19.     SYS_SetClock();
  20.     // 結(jié)果輸出
  21.     UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
  22.     // 設(shè)置P11高阻輸入模式
  23.     GPIO_P1_SetMode(GPIO_Pin_1, GPIO_Mode_Input_HIP);
  24.     // 使用通道: ADC1
  25.     ADC_SetChannel(0x01);
  26.     // ADC時(shí)鐘 = SYSCLK / 2 / (1+15) = SYSCLK / 32
  27.     ADC_SetClockPrescaler(0x0F);
  28.     // 右對(duì)齊, 方便轉(zhuǎn)換為雙字節(jié)的結(jié)果
  29.     ADC_SetResultAlignmentRight();
  30.     // 開啟全局中斷和ADC中斷
  31.     EXTI_Global_SetIntState(HAL_State_ON);
  32.     EXTI_ADC_SetIntState(HAL_State_ON);
  33.     // 開啟ADC電源
  34.     ADC_SetPowerState(HAL_State_ON);
  35.     // 開始ADC轉(zhuǎn)換
  36.     ADC_Start();

  37.     while(1)
  38.     {
  39.         // 轉(zhuǎn)換結(jié)果輸出
  40.         UART1_TxString("Result: ");
  41.         UART1_TxHex(res >> 8);
  42.         UART1_TxHex(res & 0xFF);
  43.         UART1_TxString("\r\n");
  44.         SYS_Delay(100);
  45.     }
  46. }
復(fù)制代碼

使用ADC1, ADC2雙通道進(jìn)行轉(zhuǎn)換, 中斷(interrupt)方式

下面介紹一個(gè)更實(shí)用的例子, 中斷形式進(jìn)行多通道ADC轉(zhuǎn)換, 可以用于無線小車遙控, 雙聲道音頻采樣等
  1. #include "fw_hal.h"

  2. // 用于記錄當(dāng)前采樣的通道編號(hào)
  3. uint8_t pos;
  4. // 記錄各通道的采樣結(jié)果
  5. uint16_t res[2];

  6. // 中斷處理方法
  7. INTERRUPT(ADC_Routine, EXTI_VectADC)
  8. {
  9.     ADC_ClearInterrupt();
  10.     // 記錄采樣結(jié)果
  11.     res[pos] = ADC_RESL;
  12.     res[pos] |= (ADC_RES & 0x0F) << 8;
  13.    
  14.     // 切換到下一個(gè)通道
  15.     pos = (pos+1) & 0x1;
  16.     if (pos == 0)
  17.     {
  18.         /**
  19.          * 在采樣頻率較高時(shí), 加上這兩句能提高精度. 其機(jī)制是切換到開漏模式清除采樣口上的殘留電壓
  20.         GPIO_P1_SetMode(GPIO_Pin_1, GPIO_Mode_InOut_OD);
  21.         GPIO_P1_SetMode(GPIO_Pin_1, GPIO_Mode_Input_HIP);
  22.         */
  23.         ADC_SetChannel(0x01);
  24.     }
  25.     else
  26.     {
  27.         /**
  28.          * Uncomment these lines in high speed ADC
  29.         GPIO_P1_SetMode(GPIO_Pin_2, GPIO_Mode_InOut_OD);
  30.         GPIO_P1_SetMode(GPIO_Pin_2, GPIO_Mode_Input_HIP);
  31.         */
  32.         ADC_SetChannel(0x02);
  33.     }
  34.     ADC_Start();
  35. }

  36. // 下面的代碼和前面的基本上是一樣的, 就不詳細(xì)注釋了
  37. void main(void)
  38. {
  39.     SYS_SetClock();
  40.     // For debug print
  41.     UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
  42.     // Channel: ADC1
  43.     ADC_SetChannel(0x01);
  44.     // ADC Clock = SYSCLK / 2 / (1+15) = SYSCLK / 32
  45.     ADC_SetClockPrescaler(0x0F);
  46.     // Right alignment, high 2-bit in ADC_RES, low 8-bit in ADC_RESL
  47.     ADC_SetResultAlignmentRight();
  48.     // Enable interrupts
  49.     EXTI_Global_SetIntState(HAL_State_ON);
  50.     EXTI_ADC_SetIntState(HAL_State_ON);
  51.     // Turn on ADC power
  52.     ADC_SetPowerState(HAL_State_ON);
  53.     // Set ADC1(P1.1), ADC2(P1.2) HIP
  54.     GPIO_P1_SetMode(GPIO_Pin_1|GPIO_Pin_2, GPIO_Mode_Input_HIP);
  55.     // Start ADC
  56.     ADC_Start();

  57.     while(1)
  58.     {
  59.         UART1_TxString("Result: ");
  60.         UART1_TxHex(res[0] >> 8);
  61.         UART1_TxHex(res[0] & 0xFF);
  62.         UART1_TxChar(' ');
  63.         UART1_TxHex(res[1] >> 8);
  64.         UART1_TxHex(res[1] & 0xFF);
  65.         UART1_TxString("\r\n");
  66.         SYS_Delay(100);
  67.     }
  68. }
復(fù)制代碼


結(jié)束


以上就是STC8H使用FwLib_STC8封裝庫(kù)進(jìn)行ADC轉(zhuǎn)換的演示用例說明. 在實(shí)際使用中, 主動(dòng)查詢(polling)方式下的延時(shí)時(shí)間精度不高,
如果對(duì)采樣的時(shí)間間隔精度有要求, 建議使用中斷的形式.




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜网 | 激情亚洲 | 日本中出视频 | 久久av一区 | 日韩精品一二三 | 中文字幕一级毛片视频 | 天天久久| 欧美综合久久 | 久热久热 | 亚洲欧美一区二区三区在线 | 伊人焦久影院 | 日韩国产欧美在线观看 | 日韩乱码av | 亚洲www | 日韩精品在线观看一区二区三区 | 国产毛片视频 | 日本天天操 | av一级在线观看 | 亚洲精品一区在线 | 精品视频在线播放 | 午夜视频在线观看网址 | 日韩精品999 | 中文在线观看视频 | 亚洲一区二区在线 | 日韩伦理一区二区三区 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 91精品国产一二三 | 久久久久中文字幕 | 亚洲精品国产电影 | 成人3d动漫一区二区三区91 | 久久国产精品99久久久久久丝袜 | 国产一区二区免费 | 午夜大片 | 国产黄色大片在线观看 | 91成人精品视频 | 精精国产xxxx视频在线 | 国产精品久久久久久福利一牛影视 | 亚洲精品一区二区冲田杏梨 | 国产精品日韩高清伦字幕搜索 | 青青久草 | 国产精品视频二区三区 |