|
STC15W408AS-4-20mA(SPI4通道采集)+內(nèi)部電壓采集程序 實(shí)際項(xiàng)目用。
Project STC15W408AS_6soft_uart3(讀內(nèi)部參考BandGap-模擬串口發(fā)送)
電路原理圖如下:
STC15W408AS測(cè)試內(nèi)部BandGap參考電壓:
單片機(jī)源程序如下:
- #include "config.h"
- #include "adc.h"
- #include "delay.h"
- #include "soft_uart.h"
- #define P1n_pure_input(bitn) P1M1 |= (bitn), P1M0 &= ~(bitn)
- /************* 功能說明 **************
- 本程序演示多路ADC查詢采樣,通過模擬串口發(fā)送給上位機(jī),波特率9600,8,n,1。
- 用戶可以修改為1~8路的ADC轉(zhuǎn)換。
- 說明:
- ADC的第9通道是用來測(cè)試內(nèi)部BandGap參考電壓的,由于內(nèi)部BandGap參考電
- 壓很穩(wěn)定,不會(huì)隨芯片的工作電壓的改變而變化,所以可以通過測(cè)量?jī)?nèi)部BandGap
- 參考電壓,然后通過ADC的值便可反推出VCC的電壓,從而用戶可以實(shí)現(xiàn)自己的低
- 壓檢測(cè)功能.
- ADC的第9通道的測(cè)量方法:首先將P1ASF初始化為0,即關(guān)閉所有P1口的模擬功能
- 然后通過正常的ADC轉(zhuǎn)換的方法讀取第0通道的值,即可通過ADC的第9通道讀取當(dāng)前
- 內(nèi)部BandGap參考電壓值.
- 用戶實(shí)現(xiàn)自己的低壓檢測(cè)功能的實(shí)現(xiàn)方法:首先用戶需要在VCC很精準(zhǔn)的情況下
- (比如5.0V),測(cè)量出內(nèi)部BandGap參考電壓的ADC轉(zhuǎn)換值(比如為BGV5),并這個(gè)值保存
- 到EEPROM中,然后在低壓檢測(cè)的代碼中,在實(shí)際VCC變化后,所測(cè)量出的內(nèi)部BandGap
- 參考電壓的ADC轉(zhuǎn)換值(比如為BGVx),通過計(jì)算公式: 實(shí)際VCC = 5.0V * BGV5 / BGVx,
- 即可計(jì)算出實(shí)際的VCC電壓值,需要注意的是,第一步的BGV5的基準(zhǔn)測(cè)量一定要精確.
- 標(biāo)定內(nèi)部基準(zhǔn)Vref, 提供一個(gè)穩(wěn)定的工作電壓Vcc, 讀內(nèi)部基準(zhǔn)Nref, 計(jì)算內(nèi)部基準(zhǔn) Vref = Nref * Vcc / 1024.
- 測(cè)量某個(gè)電壓, 讀ADC值Nx, 則電壓 Ux = Vref * Nx / Nref. 一般Vref = 1220mV.
- ******************************************/
- /************* 本地常量聲明 **************/
- /************* 本地變量聲明 **************/
- u16 Nref;
- /************* 本地函數(shù)聲明 **************/
- /************* 外部函數(shù)和變量聲明 *****************/
- void ADC_config(void)
- {
- ADC_InitTypeDef ADC_InitStructure; //結(jié)構(gòu)定義
- ADC_InitStructure.ADC_Px = ADC_P10 | ADC_P11 | ADC_P12; //設(shè)置要做ADC的IO, ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
- ADC_InitStructure.ADC_Speed = ADC_360T; //ADC速度 ADC_90T,ADC_180T,ADC_360T,ADC_540T
- ADC_InitStructure.ADC_Power = ENABLE; //ADC功率允許/關(guān)閉 ENABLE,DISABLE
- ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2; //ADC結(jié)果調(diào)整, ADC_RES_H2L8,ADC_RES_H8L2
- ADC_InitStructure.ADC_Polity = PolityLow; //優(yōu)先級(jí)設(shè)置 PolityHigh,PolityLow
- ADC_InitStructure.ADC_Interrupt = DISABLE; //中斷允許 ENABLE,DISABLE
- ADC_Inilize(&ADC_InitStructure); //初始化
- ADC_PowerControl(ENABLE); //單獨(dú)的ADC電源操作函數(shù), ENABLE或DISABLE
- P1n_pure_input(0x07); //把ADC口設(shè)置為高阻輸入
- }
- /**********************************************/
- void main(void)
- {
- u8 i;
- u16 j;
- // u8 k;
- ADC_config();
- while (1)
- {
- for(i=0; i<4; i++)
- {
- delay_ms(250); //為了讓發(fā)送的速度慢一點(diǎn),延時(shí)250ms
- if(i <3) //ADC0~ADC2
- {
- j = Get_ADC10bitResult(i); //參數(shù)0~7,查詢方式做一次ADC, 返回值就是結(jié)果, == 1024 為錯(cuò)誤
- TxSend('A');
- TxSend('D');
- TxSend(i+'0');
- }
- else //內(nèi)基準(zhǔn)
- {
- P1ASF = 0;
- j = Get_ADC10bitResult(0); //讀內(nèi)部基準(zhǔn)電壓, P1ASF=0, 讀0通道
- P1ASF = ADC_P10 | ADC_P11 | ADC_P12;
- Nref = j;
- TxSend('A');
- TxSend('D');
- TxSend('r');
- TxSend('e');
- TxSend('f');
- }
- TxSend('=');
- TxSend(j/1000 + '0');
- TxSend(j%1000/100 + '0');
- TxSend(j%100/10 + '0');
- TxSend(j%10 + '0');
- TxSend(' ');
- TxSend(' ');
- TxSend('V');
- TxSend('=');
- j = (u32)1250 * (u32)j / Nref; //Ux = Vref * Nx / Nref. Vref = 1250mV
- TxSend(j/1000 + '0');
- TxSend('.');
- TxSend(j%1000/100 + '0');
- TxSend(j%100/10 + '0');
- TxSend(j%10 + '0');
- TxSend(' ');
- TxSend(' ');
- }
- PrintString("\r\n");
- //=====================================================================
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
原理圖STC15W408_V1.0 程序.zip
(711.84 KB, 下載次數(shù): 179)
2020-12-3 18:35 上傳
點(diǎn)擊文件名下載附件
原理圖STC15W408_V1.0.pdf
(513.11 KB, 下載次數(shù): 141)
2020-12-3 18:35 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|