找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于單片機(jī)ADC如何對正弦波信號的采樣?

[復(fù)制鏈接]
ID:898834 發(fā)表于 2021-7-26 15:54 | 顯示全部樓層 |閱讀模式
利用stc8a8k單片機(jī)自帶的ADC如何進(jìn)行正弦波信號的采樣?
回復(fù)

使用道具 舉報

ID:462768 發(fā)表于 2021-7-26 20:44 | 顯示全部樓層
電流轉(zhuǎn)換成電壓,這個過程和電容充電類似,電容電越多,電壓越高,然后比如用電壓觸發(fā)器,高到一個程度就觸發(fā)打開另一個電容,這些電容都是像秤砣一樣實現(xiàn)測量好的。

電壓轉(zhuǎn)換成頻率,有一個集成電路叫做壓控振蕩器,這個振蕩器的頻率是用電壓高低來決定的,然后
電壓就轉(zhuǎn)換成了頻率,這個頻率就可以通過譯碼器翻譯成數(shù)字信號。


評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-26 21:09 | 顯示全部樓層
參照STC官網(wǎng)例程就行。任何波形都一樣的。差別在于你要什么樣的數(shù)據(jù)。
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-26 21:31 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-26 21:09
參照STC官網(wǎng)例程就行。任何波形都一樣的。差別在于你要什么樣的數(shù)據(jù)。

我采集的數(shù)據(jù)浮動很大,輸入直流電就完全沒問題,輸入交流正弦波就有很大的差別
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-26 21:31 | 顯示全部樓層
m2006410 發(fā)表于 2021-7-26 20:44
電流轉(zhuǎn)換成電壓,這個過程和電容充電類似,電容電越多,電壓越高,然后比如用電壓觸發(fā)器,高到一個程度就觸 ...

用單片機(jī)自帶ADC如何實現(xiàn)呢
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-7-26 21:32 | 顯示全部樓層
"進(jìn)行正弦波信號的采樣"
你這是要干嘛呢?這ADC是有嚴(yán)謹(jǐn)?shù)倪壿嫷?不是說"我出去吃個飯",然后你可以點個外賣,也可以吃燒烤,來碗螺獅粉也行的
這正弦波有:頻率,峰-峰值,平均值,有效值(220V市電說的就是有效值),多點采樣(玩音響用得到,可以叫頻譜顯示)
還有一個是要精密整流之后的數(shù)據(jù),那玩意沒玩過,不好說
那么,你現(xiàn)在是要采什么樣呢?
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-26 21:35 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-7-26 21:32
"進(jìn)行正弦波信號的采樣"
你這是要干嘛呢?這ADC是有嚴(yán)謹(jǐn)?shù)倪壿嫷?不是說"我出去吃個飯",然后你可以點個外賣 ...

是要對正弦波的有效值進(jìn)行采樣,頻率為1Khz,幅度為0-50mv的正弦波進(jìn)行采樣
回復(fù)

使用道具 舉報

ID:893692 發(fā)表于 2021-7-27 02:22 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-26 21:31
我采集的數(shù)據(jù)浮動很大,輸入直流電就完全沒問題,輸入交流正弦波就有很大的差別

對啊 交流采樣信號就是這樣,采集交流的時候你要考慮抬升信號的電位,不然負(fù)半軸的電壓無法采集到
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 09:13 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-26 21:35
是要對正弦波的有效值進(jìn)行采樣,頻率為1Khz,幅度為0-50mv的正弦波進(jìn)行采樣

純交流波形的話。因為正負(fù)半周是對稱的。如果對精度要求不高。精度為全波的1半,可以不采集負(fù)半周的也行。從正半周那里取數(shù)據(jù)計算就行了。有交值就是至少在連續(xù)采集1個正弦波周期內(nèi)的信號值。然后取最大的ADC值*2,即為峰-峰值,再通過峰-峰值換算公式轉(zhuǎn)成有效值。具體換算公式可百度
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 09:43 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-27 09:13
純交流波形的話。因為正負(fù)半周是對稱的。如果對精度要求不高。精度為全波的1半,可以不采集負(fù)半周的也行 ...

我用信號發(fā)生器輸出了一個頻率為1kHZ,最大值為3V,最小值為1V的正數(shù)正弦波,用ADC采集到的數(shù)據(jù)依舊波動很大
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 09:44 | 顯示全部樓層
m24 發(fā)表于 2021-7-27 02:22
對啊 交流采樣信號就是這樣,采集交流的時候你要考慮抬升信號的電位,不然負(fù)半軸的電壓無法采集到

我用信號發(fā)生器輸出了一個頻率為1kHZ,最大值為3V,最小值為1V的正數(shù)正弦波,用ADC采集到的數(shù)據(jù)依舊波動很大
回復(fù)

使用道具 舉報

ID:169891 發(fā)表于 2021-7-27 09:54 | 顯示全部樓層
你的采樣速度是多少呢,能正確反應(yīng)1KHZ的信號嗎
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 10:29 | 顯示全部樓層
ljfljfljf123 發(fā)表于 2021-7-27 09:54
你的采樣速度是多少呢,能正確反應(yīng)1KHZ的信號嗎

我選擇的是416個系統(tǒng)時鐘轉(zhuǎn)換一次
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 10:45 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-27 09:43
我用信號發(fā)生器輸出了一個頻率為1kHZ,最大值為3V,最小值為1V的正數(shù)正弦波,用ADC采集到的數(shù)據(jù)依舊波動 ...

下面代碼僅供參考,不一定能運(yùn)行,隨便打的.如有不當(dāng).請指正.只是方便說明編程思路.
unsigned int get VRMS()
{
unsigned int i;
unsigned int tem,max=0;
for(i=0;i<1000;i++)  //循環(huán)1000次.這個次數(shù)根據(jù)實際情況設(shè)置.一般要>=一個波形周期的時間.比如1KHz的
                               //單個周期就是1/1000=1ms,保證循環(huán)時間大于1ms就行了.
  {
     tem=Get_ADC_value();  //取ADC值
     if(tem>max) max=tem; //這個周期內(nèi)的最大值即峰-峰值.
  }
max=max*2;//因為只采集了正半周期的波形.所以一個全波的峰峰值即加上負(fù)半周信號*2
max=max/2.828  //  峰_峰值求RMS值公式:RMS=Peak_Peak/sqrt(8),為方便計算.直接寫上了sqrt(8)=2.828
return max;   //返修RMS值.注意這個只是ADC值.再根據(jù)實際情況換算成標(biāo)準(zhǔn)電壓就行.比如參考電壓是5V,那就是:5/4095*max
}
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 11:04 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-27 10:45
下面代碼僅供參考,不一定能運(yùn)行,隨便打的.如有不當(dāng).請指正.只是方便說明編程思路.
unsigned int get VRM ...

多謝,我參考一下方法
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 11:29 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-27 10:45
下面代碼僅供參考,不一定能運(yùn)行,隨便打的.如有不當(dāng).請指正.只是方便說明編程思路.
unsigned int get VRM ...

這個程序適用于一個周期全為正的正弦波嗎,不存在負(fù)半周為負(fù)
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 12:58 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-27 11:29
這個程序適用于一個周期全為正的正弦波嗎,不存在負(fù)半周為負(fù)

全為正的話。那就去掉max*2就行。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-7-27 13:06 | 顯示全部樓層
為什么學(xué)單片機(jī)的教程都會有說到要學(xué)習(xí)模擬電路基礎(chǔ)的呢
你一個正弦波,不管有沒有負(fù)半周,它的電壓都是在變化的,那么,單片機(jī)ADC只是一段時間內(nèi)(就是ADC轉(zhuǎn)換時間)的電壓,每次轉(zhuǎn)換的時間不同,電壓也會不同,波動就是這么來的
你肯定要有一個濾波電路的
我沒有具體的做過50mV的,所以,不知道要不要精密整流(不是整流,精密整流是一個絕對值電路),還要加一個濾波電路,這樣就得到一個峰值,想要有效值,還得再除以根號2
自己上網(wǎng)先學(xué)一下吧

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 13:47 | 顯示全部樓層
拋開模擬電路基礎(chǔ),要求一個RMS,(也就是有效值,通俗地說,就是萬用表打到AC檔。再測試正弦波交流電壓的值。),只需要知道峰_峰值即可,然后通過公式再求其它平均值也有,有效值也好。就很容易。
什么是峰_峰值?就是一個周期內(nèi)波形的最高點與最低點的值。所以上面的程序重點就是找到這個周期內(nèi)(不斷循環(huán)取ADC值)的最高點,即峰_峰值,那么再換算成其它就容易了。就像一個圓。知道了R半徑,再求其它面積,周長什么的。就容易了。
對于要求不高的場合,直接用一個4.7uf的電容偶合輸入到單片機(jī)的ADC引腳即可,這種方法相對簡單。只能采集正半周。可以用于實驗。如果在應(yīng)用場合,那就要根據(jù)情況再加緩沖,放大或者隔離,濾波電路了。主要是防止受干擾。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:313048 發(fā)表于 2021-7-27 14:02 | 顯示全部樓層
ADC采樣實際上你只要電壓對,采樣速率夠,按道理是不會出現(xiàn)你說的那些情況,而且看上面那些樓說的前面并一個電容啥的,這種只針對直流信號好一點,交流不建議并電容,這樣無法反應(yīng)信號的真實完整性。而且你不能直接把信號發(fā)射器產(chǎn)生的信號直接懟到單片機(jī)的ADC引腳,該信號應(yīng)該電阻到地才對,同時,如果信號發(fā)生器產(chǎn)生的是正負(fù)電壓的,你要把他通過運(yùn)放或者其他別的東西將其偏移到正電壓,或者采用差分采樣的方式進(jìn)行采樣才可得到正確的電壓

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 14:48 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-7-27 13:06
為什么學(xué)單片機(jī)的教程都會有說到要學(xué)習(xí)模擬電路基礎(chǔ)的呢
你一個正弦波,不管有沒有負(fù)半周,它的電壓都是在變 ...

好的好的,感謝指導(dǎo)
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 14:49 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-27 13:47
拋開模擬電路基礎(chǔ),要求一個RMS,(也就是有效值,通俗地說,就是萬用表打到AC檔。再測試正弦波交流電壓的 ...

多謝指導(dǎo)
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 19:35 | 顯示全部樓層
AUG 發(fā)表于 2021-7-27 14:02
ADC采樣實際上你只要電壓對,采樣速率夠,按道理是不會出現(xiàn)你說的那些情況,而且看上面那些樓說的前面并一 ...

可是交流正弦波每一個時刻的電壓值是不同的,是需要進(jìn)行多次采樣取最大值叭
回復(fù)

使用道具 舉報

ID:898834 發(fā)表于 2021-7-27 19:43 | 顯示全部樓層
wfqxgw 發(fā)表于 2021-7-27 10:45
下面代碼僅供參考,不一定能運(yùn)行,隨便打的.如有不當(dāng).請指正.只是方便說明編程思路.
unsigned int get VRM ...

這個程序邏輯我覺得沒錯,但是今天測試了以下,測量結(jié)果跟實際仍舊不同
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 21:28 | 顯示全部樓層
本帖最后由 wfqxgw 于 2021-7-27 21:33 編輯

以下輸入電路供參考。另外。轉(zhuǎn)換數(shù)據(jù)時注意變量類型。有小數(shù)點的。要用float.這里要注意,實際交流電壓是R6的5k6電阻上面的。先用萬用表測試出實際值。再用單片機(jī)驗證,如果電壓不高。1K限流電阻可以暫時不用。主要是用于驗證數(shù)據(jù)。
adc.JPG
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-7-27 22:10 | 顯示全部樓層
本帖最后由 Y_G_G 于 2021-7-28 09:06 編輯
zqz1345444061 發(fā)表于 2021-7-27 19:43
這個程序邏輯我覺得沒錯,但是今天測試了以下,測量結(jié)果跟實際仍舊不同

怎么就覺得這個邏輯可行了呢?
unsigned int tem,max=0;
for(i=0;i<1000;i++)  //循環(huán)1000次.這個次數(shù)根據(jù)實際情況設(shè)置.一般要>=一個波形周期的時間.比如1KHz的
                               //單個周期就是1/1000=1ms,保證循環(huán)時間大于1ms就行了.
  {
     tem=Get_ADC_value();  //取ADC值
     if(tem>max) max=tem; //這個周期內(nèi)的最大值即峰-峰值.
  }
你不覺得max的值就遠(yuǎn)是0嗎? if(tem>max) 里面的表達(dá)式有什么意思呢?
還有就是:5/4095*max,你去看一下數(shù)據(jù)手冊,人家是要/4096的,這種公式在12位ADC可能沒有什么問題
但如果是多次采樣進(jìn)行平均或者相加,誤差就大了
沒看仔細(xì),這是個壇循環(huán),我還以為是中斷了,前面我的理解錯了
回復(fù)

使用道具 舉報

ID:419909 發(fā)表于 2021-7-27 22:25 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-27 19:43
這個程序邏輯我覺得沒錯,但是今天測試了以下,測量結(jié)果跟實際仍舊不同

連接原理圖。供參考。R8的1K電阻是限流電阻,ADC實際測試的交流電壓是R6的5K6電阻上的交流電壓。所以先用萬用表測試好R6上的電壓。再在單片機(jī)上驗證就行。注意。單片機(jī)在轉(zhuǎn)換為電壓時。變量類型要用float.比如 float Vin=5/4096*get VRMS();
adc.JPG
回復(fù)

使用道具 舉報

ID:313048 發(fā)表于 2021-7-28 10:20 | 顯示全部樓層
zqz1345444061 發(fā)表于 2021-7-27 19:35
可是交流正弦波每一個時刻的電壓值是不同的,是需要進(jìn)行多次采樣取最大值叭

連續(xù)采樣的過程中,你是將整個波形的電壓信號都給采樣了,最大值也包括在里面。除非你一個信號周期里面的采樣點非常少,那么有可能采不到最高電壓,所以這跟你的采樣速率有關(guān)系,假如你一個信號周期里面有100個采樣點,那么完完全全可以采樣到最高值。
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2021-7-28 19:44 | 顯示全部樓層
純正弦波可以先精密整流然后濾波成直流來測試。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表