1. 綜訴
想學(xué)會(huì)如何在STM8上使用ADC這個(gè)功能,我們先得了解單片機(jī)中ADC究竟是什么。
ADC是模擬信號(hào)轉(zhuǎn)成數(shù)值信號(hào),單片機(jī)只能識(shí)別TTL電平,其實(shí)就是 1 或者 0 ,但是如果我們給它一個(gè)3.3V電壓,單片機(jī)就無(wú)法識(shí)別,,若想使用單片機(jī)讀取出來(lái)得時(shí)候,它必須將模擬量變成數(shù)字量。
2. 關(guān)于STM8S103手冊(cè)的ADC簡(jiǎn)介
由官方的全英手冊(cè)可知。
----------------------------------------------------------------------------------------------------------------------------------
STM8中ADC1和ADC2主要功能如下:
10位分辨率
單詞和連續(xù)的轉(zhuǎn)換模式
可編程的(轉(zhuǎn)換頻率的)預(yù)分頻,fMASTER 可以被分頻 2到18
可選擇ADC專(zhuān)用外部中斷(ADC_ETR)或者定時(shí)器觸發(fā)信號(hào)(TRGO)來(lái)作為外部觸發(fā)信號(hào)
模擬放大(對(duì)于具有VREF引角的型號(hào))
轉(zhuǎn)換結(jié)束時(shí)可產(chǎn)生中斷
靈活的數(shù)據(jù)對(duì)齊方式
ADC輸入電壓范圍:VSSA≤VIN≤VDDA
----------------------------------------------------------------------------------------------------------------------------------
ADC1具有以下拓展功能:
帶緩沖的連續(xù)轉(zhuǎn)換模式
單次和連續(xù)轉(zhuǎn)換的掃描模式
具有上限和下限門(mén)檻的模擬看門(mén)狗
模擬看門(mén)狗時(shí)間發(fā)生可產(chǎn)生中斷
----------------------------------------------------------------------------------------------------------------------------------
3. 例程
3.1 編譯環(huán)境
我的編譯環(huán)境是IAR,這款軟件是現(xiàn)在STM8的主流平臺(tái),比較推薦。不過(guò)我打算等到STCubeMX更新出比較方便的版本后再去使用Keil5,因?yàn)槲以谟肧TM32的時(shí)候就是利用Keil5,的確很方便,你們也可以學(xué)著用一下。
3.2 主芯片
我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一樣(外設(shè)和CPU頻率,F(xiàn)LASH),在代碼相同的情況下均可進(jìn)行燒寫(xiě)。
3.3 庫(kù)文件的添加
我們的工程可以在IAR的例程中復(fù)制,操作過(guò)程:打開(kāi)STM8S_StdPeriph_Lib(這是一個(gè)官方的庫(kù)文件,下載IAR STM8包的時(shí)候就攜帶,里面有庫(kù)文件和相對(duì)應(yīng)的例程),將Libraries文件復(fù)制到你工程所在的文件下,并將有關(guān)于ADC的庫(kù)文件添加到你的工程列表當(dāng)中。添加完成后,有可能你會(huì)看到一些C文件會(huì)有紅色的小點(diǎn)報(bào)錯(cuò),這是因?yàn)槟氵x的芯片上沒(méi)有該功能,你需要將其刪掉才能不報(bào)錯(cuò)。如圖。
添加成功后,我們需要將頭文件添加進(jìn)來(lái),頭文件的路徑存放在 Libraries->STM8S_StdPeriph_Driver->inc中,如圖。
3.4 代碼編寫(xiě)
STM8SF003這款芯片能用的是5個(gè)AD采樣通道,分別為為AIN2~AIN6。其一個(gè)通道AIN7,但在官方手冊(cè)中我沒(méi)找到有對(duì)其描述的,感興趣的朋友可以去察看芯片的英文手冊(cè)進(jìn)行研究,也許會(huì)找到和我不一樣的結(jié)果。
在ADC頭文件中,將ADC1所有的ADC1_CHANNEL(ADC通道)都進(jìn)行枚舉,以方便調(diào)用。
1 /* Enum ----------------------------------------------------------------------*/
2
3 enum ADC1_CHANNEL
4 { //bit 8 7 6 5 4 3 2 1
5
6 ADC1_CHANNEL2 = 0x01, // 0 0 0 0 0 0 0 1
7 ADC1_CHANNEL3 = 0x02, // 0 0 0 0 0 0 1 0
8 ADC1_CHANNEL4 = 0x04, // 0 0 0 0 0 1 0 0
9 ADC1_CHANNEL5 = 0x08, // 0 0 0 0 1 0 0 0
10 ADC1_CHANNEL6 = 0x10 // 0 0 0 1 0 0 0 0
11
12 };
在ADC.C文件中,分為了多個(gè)函數(shù),降低他們的耦合性,也方便理解。
首先是ADC中引角的初始化,將你所選通道的引角進(jìn)行初始化,沒(méi)有選到的就不進(jìn)行初始化。
1 /*******************************************************************************
2 * Function Name : MX_ADC_GPIO_Init
3 * Description : ADC GPIO Init
4 * Input : ADC1_CHANNEL
5 * Output : None
6 * Return : None
7 ********************************************************************************/
8
9 void MX_ADC_GPIO_Init(uint8_t ADC1_CHANNEL)
10 {
11 switch(ADC1_CHANNEL)
12 {
13 case ADC1_CHANNEL2: GPIO_Init(ADC_Opt_GPIOC_Port,ADC_channe2_Pin,GPIO_MODE_IN_PU_NO_IT);break;
14 case ADC1_CHANNEL3: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe3_Pin,GPIO_MODE_IN_PU_NO_IT);break;
15 case ADC1_CHANNEL4: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe4_Pin,GPIO_MODE_IN_PU_NO_IT);break;
16 case ADC1_CHANNEL5: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe5_Pin,GPIO_MODE_IN_PU_NO_IT);break;
17 case ADC1_CHANNEL6: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe6_Pin,GPIO_MODE_IN_PU_NO_IT);break;
18 }
19
20 }
然后是ADC1的選擇通道初始化:ADC連續(xù)讀取,所選的通道,二分頻,外部轉(zhuǎn)換觸發(fā),外部觸發(fā)器不開(kāi)啟,數(shù)據(jù)右對(duì)齊,施密特觸發(fā),不開(kāi)啟。(注意:STMS8003中的串口使用了PD5和PD6,與ADC1中通道5、通道6發(fā)生沖突,故不可使用。如需使用,請(qǐng)將串口的TXRX引角更改換為其它的引角。)
1 /*******************************************************************************
2 * Function Name : MX_ADC1_CHANNEL_Init
3 * Description : ADC CHANNEL Init
4 * Input : ADC1_CHANNEL
5 * Output : None
6 * Return : None
7 ********************************************************************************/
8
9 void MX_ADC1_CHANNEL_Init(uint8_t ADC1_CHANNEL)
10 {
11 switch(ADC1_CHANNEL)
12 {
13 case ADC1_CHANNEL2:
14 {
15 ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_2,
16 ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
17 ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL2, DISABLE);break;
18 }
19 case ADC1_CHANNEL3:
20 {
21 ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3,
22 ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
23 ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);break;
24 }
25 case ADC1_CHANNEL4:
26 {
27 ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4,
28 ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
29 ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);break;
30 }
31 case ADC1_CHANNEL5:
32 {
33 ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_5,
34 ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
35 ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL5, DISABLE);break;
36 }
37 case ADC1_CHANNEL6:
38 {
39 ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6,
40 ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
41 ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6, DISABLE);break;
42 }
43 }
44 }
這里就是將所有的ADC初始化進(jìn)行一個(gè)統(tǒng)一的一個(gè)歸類(lèi)。
1 /*******************************************************************************
2 * Function Name : MX_ADC1_Init
3 * Description : ADC Init
4 * Input : ADC1_CHANNEL
5 * Output : None
6 * Return : None
7 ********************************************************************************/
8 void MX_ADC1_Init(uint8_t ADC1_CHANNEL)
9 {
10 //初始化GPIO
11 MX_ADC_GPIO_Init(ADC1_CHANNEL);
12
13 //初始化ADC1所有寄存器
14 ADC1_DeInit();
15
16 //配置ADC1寄存器中的參數(shù)
17 MX_ADC1_CHANNEL_Init(ADC1_CHANNEL);
18
19 //使能ADC1
20 ADC1_Cmd(ENABLE);
21
22 //ADC1轉(zhuǎn)換開(kāi)始
23 ADC1_StartConversion();
24 }
最后就是數(shù)據(jù)獲取,可以選擇直接獲取數(shù)據(jù),也可以獲取十次數(shù)據(jù)后取平均數(shù)。
注意:
ADC獲取的值是AD值,需要將其進(jìn)行代入公式中才能得到電壓值。
Vin = (ADC * Vref) / 1024
VCC很明顯可以使用萬(wàn)用表先測(cè)出來(lái),1024是因?yàn)镾TM8S這款的AD是10位精度。
這里測(cè)試的VCC是3.35V,VCC另外一個(gè)意思就是單片機(jī)的供給電源。
1 /*******************************************************************************
2 * Function Name : MX_ADC1_Get_Data
3 * Description : get VCC data
4 * Input : None
5 * Output : None
6 * Return : fVCC
7 ********************************************************************************/
8 float MX_ADC1_Get_Data(void)
9 {
10 int iADC1_Value;
11 float fVCC;
12
13 //讀取轉(zhuǎn)換結(jié)果
14 iADC1_Value = ADC1_GetConversionValue();
15 fVCC = (iADC1_Value * 3.350)/1024;
16 return fVCC;
17
18 }
19
20
21 /*******************************************************************************
22 * Function Name : MX_ADC1_Get_Average_Data
23 * Description : Get VCC ten times average data.
24 * Input : None
25 * Output : None
26 * Return : fAverage_VCC
27 ********************************************************************************/
28 float MX_ADC1_Get_Average_Data(void)
29 {
30 int i;
31 float fAverage_VCC = 0.0;
32
33 for(i=0;i<10;i++)
34 {
35 fAverage_VCC += MX_ADC1_Get_Data();
36 }
37 fAverage_VCC /= 10;
38
39 return fAverage_VCC;
40
41 }
將上面需要用到的函數(shù)在主函數(shù)中調(diào)用打印即可。
4. 實(shí)驗(yàn)結(jié)果
調(diào)試儀器:可調(diào)式電源,可通過(guò)旋鈕控制電壓的輸出大小。
當(dāng)沒(méi)有輸出電壓時(shí),打印的值為0V.
當(dāng)可調(diào)式電源輸出的電壓值為3.3V,串口助手上打印的也是3.3V。
當(dāng)可調(diào)式電源輸出的電壓值為24V,串口助手上打印的也是24V。
注意:請(qǐng)不要將24V電源直接通入單片機(jī)中,我是自己設(shè)置了一條電路進(jìn)行測(cè)試的。ADC的最大輸入電壓是3.3V,為了安全起見(jiàn),請(qǐng)不要超過(guò)該值。
注意:請(qǐng)不要將24V電源直接通入單片機(jī)中,我是自己設(shè)置了一條電路進(jìn)行測(cè)試的。ADC的最大輸入電壓是3.3V,為了安全起見(jiàn),請(qǐng)不要超過(guò)該值。
注意:請(qǐng)不要將24V電源直接通入單片機(jī)中,我是自己設(shè)置了一條電路進(jìn)行測(cè)試的。ADC的最大輸入電壓是3.3V,為了安全起見(jiàn),請(qǐng)不要超過(guò)該值。
5. 結(jié)尾
對(duì)STM8的ADC的說(shuō)明和引用到這里結(jié)束,感謝各位看官的點(diǎn)擊。
上一篇:基于STM8的TIM定時(shí)器操作---STM8-第三章
下一篇:基于STM8的IIC協(xié)議--協(xié)議篇
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- 座椅、天窗、電動(dòng)尾門(mén)應(yīng)用 國(guó)產(chǎn)車(chē)規(guī)級(jí)高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車(chē)企車(chē)機(jī)“崩了”
- 寧德時(shí)代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎(jiǎng)”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會(huì)重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國(guó)產(chǎn)突圍并存
- 國(guó)內(nèi)飛行汽車(chē)無(wú)線通信測(cè)試成功,通信安全新突破
- SPAD席卷車(chē)載激光雷達(dá)市場(chǎng)
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬(wàn)級(jí)像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車(chē)AI創(chuàng)新技術(shù) 提升車(chē)輛安全性和用戶(hù)體驗(yàn)
- 智能云鎖哪家強(qiáng)?TI市場(chǎng)和技術(shù)大咖邀你1月16日10:00直播間暢聊
- 免費(fèi)申請(qǐng)Adafruit開(kāi)發(fā)板 |處理器、傳感器、LED、USB一體化設(shè)計(jì)板,功能強(qiáng)大!
- 【EE團(tuán)】盡享TI MSP-EXP430FR5739實(shí)驗(yàn)板套件!
- 雙11之單片機(jī)狂歡:11.11元包郵拇指板STM32L011,搶完為止
- 直播已結(jié)束|TI Zigbee 3.0及多協(xié)議解決方案
- 【有獎(jiǎng)活動(dòng)】與春天有個(gè)約會(huì)--曬照片
- 發(fā)原創(chuàng)書(shū)評(píng) 贏MSP430開(kāi)發(fā)板
- 是德科技推出新的8通道示波器 點(diǎn)擊獲取報(bào)價(jià)
- 趣味電子技術(shù)史話欄目開(kāi)播啦!第一集:白熾燈到底是誰(shuí)發(fā)明的?
- 加密技術(shù)—安全的關(guān)鍵
- iPhone 12系列保護(hù)殼解密:這外形你愛(ài)嗎?
- 小米新款智能機(jī)器人小丹,互動(dòng)更人性化?
- 已量產(chǎn)業(yè)界最小尺寸硅麥芯片,通用微完成超過(guò)億元B輪融資
- 富士通推出-55℃操作運(yùn)行的64-Kbit FRAM
- Littelfuse榮獲CEM“最具競(jìng)爭(zhēng)力汽車(chē)電子產(chǎn)品”編輯選擇獎(jiǎng)
- 中國(guó)芯片路在何方?專(zhuān)家:最大問(wèn)題是太想明天就成功
- SMIC中國(guó)區(qū)Q1收入同比增40%,工藝研發(fā)進(jìn)展順利
- 谷歌英特爾等入選美政府無(wú)人機(jī)應(yīng)用項(xiàng)目 大疆和亞馬遜落選
- 17臺(tái)智能機(jī)器人現(xiàn)身法律援助大廳