摘要:對(duì)于電壓或者電流連續(xù)變化的信號(hào),就需要通過(guò)模數(shù)轉(zhuǎn)換電路,變成單片機(jī)可以識(shí)別的數(shù)字電平信號(hào)。目前來(lái)說(shuō),常見(jiàn)的有兩種方式,一種是并行比較,一種是逐次比較。具有成本低元件簡(jiǎn)單等優(yōu)勢(shì),而且容易做出高精度的轉(zhuǎn)換器,所以被廣泛使用。
模擬量—>數(shù)字量(ADC模塊)
5V 單片機(jī) CPU 電路是二進(jìn)制的,運(yùn)算過(guò)程中,電壓只有2種:高電平 5V 和低電平 0V 。對(duì)于電壓或者電流連續(xù)變化的信號(hào),就需要通過(guò)模數(shù)轉(zhuǎn)換電路,變成單片機(jī)可以識(shí)別的數(shù)字電平信號(hào)。 MP3 就是用 ADC 采樣保存的失真文件。
模擬量變成數(shù)字量,通常都是用比較器來(lái)負(fù)責(zé)轉(zhuǎn)換。目前來(lái)說(shuō),常見(jiàn)的有兩種方式,一種是并行比較,一種是逐次比較。
**并行比較器:**速度比較快,但是采用的元件非常非常多。成本會(huì)非常高。所以,實(shí)用性不是很廣泛
**逐次比較器:**通過(guò)反饋控制,多次運(yùn)算后,轉(zhuǎn)換出結(jié)果。具有成本低、元件簡(jiǎn)單等優(yōu)勢(shì),而且容易做出高精度的轉(zhuǎn)換器,所以被廣泛使用。
先來(lái)玩?zhèn)€游戲 :狗蛋拿了些花生米,跟你說(shuō),想吃就要先猜對(duì)有多少個(gè)。告訴你最多是 255 顆,你猜的時(shí)候,可以告訴你多了或者少了。那么,怎么猜才能最快猜出花生米的數(shù)量?
猜的時(shí)候,為了方便計(jì)算, 我們多加 0.5 顆花生米。
==第一步:==猜 255 ÷ 2 +0.5=128. 狗蛋告訴你,多了 (0) 。
第二步:猜 128 ÷ 2=64. 狗蛋告訴你,少了 (1)。
第三步:猜 (128 + 64) ÷ 2=96. 狗蛋 告訴 你,多了 (0) 。
第四步:猜 (96 + 64) ÷ 2=80. 狗蛋 告訴 你,少了 (1) 。
第五步:猜 (96 + 80) ÷ 2=88. 狗蛋 告訴 你,少了(1)。
第六步:猜 (96 + 88) ÷ 2=92. 狗蛋 告訴 你,多了(0)。
第七步:猜 (92+ 88) ÷ 2=90. 狗蛋 告訴 你,多了(0) 。
第八步:猜 (90+ 88) ÷ 2=89. 狗蛋 告訴 你,猜對(duì) (?) 。
得出結(jié)果: 如果不加 0.5 ,實(shí)際計(jì)算公式得結(jié)果是 88.65234375 。實(shí)際上88.65比89小所以是 1
四舍五入, 89>88.65, 取 ?= 1 ;得出結(jié)果就是 0 1 0 1 1 0 0 1 =89=0x59;
1.ADC口配置成ADC輸入模式或者高阻模式
2.ADC控制寄存器:ADC_CONTR.控制電源,轉(zhuǎn)換速度,標(biāo)志位,啟動(dòng)位,通道選擇[2:0]
3.ADC采樣結(jié)果輸出寄存器ADC_RES,ADC_RESL??梢允荹1:0]+[7:0],也可以是[7:0]+[1:0].
4.ADC轉(zhuǎn)換,跟中斷有關(guān)的寄存器IE
5.輔助寄存器AUXR1,主要是控制結(jié)果寄存器的存儲(chǔ)格式
我是準(zhǔn)備用ADC0來(lái)檢測(cè)電池電壓的,具體看老師需求,然后把示數(shù)顯示到數(shù)碼管上面,因?yàn)橹拔页鲞^(guò)數(shù)碼管博客,大家可能還有點(diǎn)印象,不知道的看真正的數(shù)碼管
//ADC初始化void ADC_Init(){ P1M1 |= 0x0f; P1M0 &= ~0x0f;//P1.0腳ADC0 P1ASF |= 0x0f;// P1M1 |= 0x02;// P1M0 &= ~0x02;//P1.1腳ADC1// P1ASF |= 0x02; CLK_DIV |= 0x20; ADC_RES = 0; ADC_RESL = 0;}
//ADC讀數(shù)據(jù)底層驅(qū)動(dòng)void ADC_Read_Data_Drive(){ //轉(zhuǎn)換之前先把轉(zhuǎn)換結(jié)果寄存器清零 ADC_RES = 0; ADC_RESL = 0; //啟動(dòng)轉(zhuǎn)換 ADC_CONTR = 0x88;//轉(zhuǎn)換速度我用最慢的 //等到ADC_FLAG為1 while(!(ADC_CONTR&0x10)); //然后把數(shù)據(jù)傳到緩存變量里面去 ADC_Read_Data = ADC_RES<<8; ADC_Read_Data = ADC_Read_Data+ADC_RESL; }
采集電壓
#include "all.h"//有數(shù)據(jù)那我們就得存u16 xdata ADC_Read_Data = 0;u16 xdata ADC_Filter_Data = 0;//ADC初始化void ADC_Init(){ P1M1 |= 0x0f; P1M0 &= ~0x0f;//P1.0腳ADC0 P1ASF |= 0x0f;// P1M1 |= 0x02;// P1M0 &= ~0x02;//P1.1腳ADC1// P1ASF |= 0x02; CLK_DIV |= 0x20; ADC_RES = 0; ADC_RESL = 0;}//ADC讀數(shù)據(jù)底層驅(qū)動(dòng)void ADC_Read_Data_Drive(){ //轉(zhuǎn)換之前先把轉(zhuǎn)換結(jié)果寄存器清零 ADC_RES = 0; ADC_RESL = 0; //啟動(dòng)轉(zhuǎn)換 ADC_CONTR = 0x88;//轉(zhuǎn)換速度我用最慢的 //等到ADC_FLAG為1 while(!(ADC_CONTR&0x10)); //然后把數(shù)據(jù)傳到緩存變量里面去 ADC_Read_Data = ADC_RES<<8; ADC_Read_Data = ADC_Read_Data+ADC_RESL; }//全局的ADC濾波數(shù)據(jù)結(jié)構(gòu)體指針ADC_Data* adc_filter;//ADC濾波數(shù)據(jù)底層驅(qū)動(dòng)void ADC_Filter_Data_Drive(){ /*u16 ADC_Min = 0; u16 ADC_Max = 0; u16 ADC_Tmp = 0; u16 ADC_Result = 0;*/ //設(shè)置兩個(gè)循環(huán)變量 u8 i = 0; u8 j = 0; ADC_Filter_Data = 0; ADC_Read_Data_Drive(); for(i = 0;i<4;i++)//外層8次循環(huán) { adc_filter->ADC_Result = 0; adc_filter->ADC_Min = adc_filter->ADC_Max = ADC_Read_Data; for(j = 0;j<4;i++)//內(nèi)層8次循環(huán) { adc_filter->ADC_Tmp = ADC_Read_Data; if (adc_filter->ADC_Tmp < adc_filter->ADC_Min) { adc_filter->ADC_Result += adc_filter->ADC_Tmp; adc_filter->ADC_Min = adc_filter->ADC_Tmp; } else if (adc_filter->ADC_Tmp > adc_filter->ADC_Max) { adc_filter->ADC_Result += adc_filter->ADC_Tmp; adc_filter->ADC_Max = adc_filter->ADC_Tmp; } else { adc_filter->ADC_Result += adc_filter->ADC_Tmp; } } adc_filter->ADC_Result /= 4; ADC_Filter_Data += adc_filter->ADC_Result; } ADC_Filter_Data /= 4;}
#ifndef ADC_Drive#define ADC_Drivetypedef struct ADC_Filter_Data{ u16 ADC_Min; //ADC最小值 u16 ADC_Max; //ADC最大值 u16 ADC_Tmp; //ADC臨時(shí)值 u16 ADC_Result; //ADC結(jié)果} ADC_Data;//外部聲明extern void ADC_Init();extern void ADC_Read_Data_Drive();extern void ADC_Filter_Data_Drive();extern u16 xdata ADC_Read_Data;extern u16 xdata ADC_Filter_Data;#endif
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124049.html
摘要:復(fù)位后初值是子函數(shù)調(diào)用,中斷響應(yīng)過(guò)程調(diào)用子函數(shù)處理中斷響應(yīng)的時(shí)候,程序計(jì)數(shù)器的值以及相關(guān)數(shù)據(jù)會(huì)先壓入堆棧,然后去處理子函數(shù)中斷服務(wù)。聯(lián)動(dòng)文章身家過(guò)億的帝都富豪對(duì)小碼農(nóng)說(shuō)你時(shí)空復(fù)雜度會(huì)了嗎 ...
摘要:行列總共使用個(gè)口,可以掃描個(gè)按鍵的開(kāi)關(guān)狀態(tài),這就是矩陣鍵盤(pán)的優(yōu)勢(shì)??谥g必須串聯(lián)電阻。 文章目錄 小碼農(nóng)為了總裁,咳咳,為了知識(shí)敢說(shuō)按鍵不會(huì)嗎?==**帝都富豪與...
摘要:否則可能會(huì)導(dǎo)致電平顛倒完美的計(jì)數(shù)糟糕的線條再來(lái)一個(gè)測(cè)試組我們來(lái)實(shí)現(xiàn)一個(gè)呼吸燈的效果呼吸燈波形為了賢淑妻子,咳咳,賢淑才女,小碼農(nóng)必定讓控制時(shí)間什么是脈寬調(diào)制中間動(dòng)的線是電流線,電流通斷,電流小就暗,電流大就亮。 ...
摘要:目前,所有型號(hào)串口的輸入是輸出是。串口全雙工通信是沒(méi)有時(shí)鐘脈沖的,只能依靠晶振脈沖定時(shí)器的溢出脈沖。中斷中讀取,清標(biāo)志,然后返回給計(jì)算機(jī),等待發(fā)送完畢防重疊最少時(shí)間次位定時(shí)器時(shí)間。實(shí)現(xiàn)燒錄程序的目的。 ...
摘要:關(guān)于芯片的選型,還是其他芯片的選型,那都不是隨隨便便就說(shuō)了算得。芯片成本參差不齊,選的好直接起飛,選的不好,直接破產(chǎn)。 關(guān)于ADC芯片的選型,還是其他芯片的選型,那...
閱讀 1309·2021-11-22 13:54
閱讀 1495·2021-11-22 09:34
閱讀 2790·2021-11-22 09:34
閱讀 4181·2021-10-13 09:39
閱讀 3408·2019-08-26 11:52
閱讀 3419·2019-08-26 11:50
閱讀 1592·2019-08-26 10:56
閱讀 2002·2019-08-26 10:44