找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

想知道怎么用51單片機(jī)接收PWM信號

[復(fù)制鏈接]
ID:1001922 發(fā)表于 2022-4-19 19:12 | 顯示全部樓層 |閱讀模式
我的二氧化碳傳感器MH-Z19輸出的是PWM信號,我要用51單片機(jī)的I/O口接收這個信號,怎么獲得PWM的占空比呢?我聽說用一個外部中斷和定時器可以實現(xiàn),我在網(wǎng)上看到了一個接收的方式,用了外部中斷0和計數(shù)器0,但是他用的STC15F100W-STC15F104W芯片,這個芯片的外部中斷0檢測到上升沿和下降沿都會進(jìn)入外部中斷,檢測到上升沿就開啟計數(shù)器從零開始計數(shù),檢測到下降沿就獲取計數(shù)值(得到了高電平持續(xù)的時間),再將計數(shù)器置零等待下一個上升沿。我的芯片是STC89C516RD+,外部中斷只能檢測到下降沿,所以用不了上述方法。
求問還有什么方式可以檢測到PWM的占空比?
(其實二氧化碳傳感器MH-Z19也能用串口傳輸數(shù)據(jù),但是我的芯片只有一個串口,而且串口要與上位機(jī)通信,所以只能選擇PWM的形式了)
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-19 21:22 來自觸屏版 | 顯示全部樓層
不在乎性能的話,在外部中斷中處理完下降沿的工作后while(p32==0);  等到上升沿后處理完上升沿的活,再退出中斷。 在乎性能的話,int0直接接pwm輸入,int1通過反向器接pwm,分別處理上升沿和下降沿,當(dāng)然也可以用npn代替反向器。
回復(fù)

使用道具 舉報

ID:732794 發(fā)表于 2022-4-19 21:31 | 顯示全部樓層
PWM轉(zhuǎn)換成電壓信號給單片機(jī),單片機(jī)ADC取值后除以基準(zhǔn),得到占空比。
此方案有微小的誤差(~1%),看你的取決了。
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2022-4-20 06:27 | 顯示全部樓層
51FAN2020 發(fā)表于 2022-4-19 21:31
PWM轉(zhuǎn)換成電壓信號給單片機(jī),單片機(jī)ADC取值后除以基準(zhǔn),得到占空比。
此方案有微小的誤差(~1%),看你的 ...

此型號不支持ADC,建議使用STC8系列,其次STC15 1.png
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-4-20 09:15 | 顯示全部樓層
MH-Z19有兩種輸出:UART和PWM。
1.采用沙發(fā)建議。
2.加74157,串口分時復(fù)用。
3.換增強(qiáng)型芯片。
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-20 22:44 | 顯示全部樓層
188610329 發(fā)表于 2022-4-19 21:22
不在乎性能的話,在外部中斷中處理完下降沿的工作后while(p32==0);  等到上升沿后處理完上升沿的活,再退 ...

感謝 我的問題已經(jīng)解決
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-20 22:44 | 顯示全部樓層
wulin 發(fā)表于 2022-4-20 09:15
MH-Z19有兩種輸出:UART和PWM。
1.采用沙發(fā)建議。
2.加74157,串口分時復(fù)用。

感謝 我的問題已經(jīng)解決
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-20 22:45 | 顯示全部樓層
51FAN2020 發(fā)表于 2022-4-19 21:31
PWM轉(zhuǎn)換成電壓信號給單片機(jī),單片機(jī)ADC取值后除以基準(zhǔn),得到占空比。
此方案有微小的誤差(~1%),看你的 ...

感謝 我的問題已經(jīng)解決
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-20 22:45 | 顯示全部樓層
npn 發(fā)表于 2022-4-20 06:27
此型號不支持ADC,建議使用STC8系列,其次STC15

感謝 我的問題已經(jīng)解決
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-20 23:36 | 顯示全部樓層
我今天突然頓悟,只用STC89C516RD+單片機(jī)的定時器1實現(xiàn)了PWM信號的檢測。大概是這樣的:利用定時器,1ms進(jìn)入一次中斷,在中斷函數(shù)中,利用if檢測上升沿和下降沿,遇到上升沿就用一個變量保存高電平持續(xù)時間;遇到下降沿,就繼續(xù)記錄PWM持續(xù)時間,直到遇到下一個上升沿,將記錄的PWM持續(xù)時間存起來。就得到了高電平持續(xù)時間和整個PWM持續(xù)時間,進(jìn)而得到占空比。實測可行。
但是每1ms就進(jìn)入一次中斷,可能有點(diǎn)不好,但我說不出來哪不好。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-21 00:21 | 顯示全部樓層
Ruuci 發(fā)表于 2022-4-20 23:36
我今天突然頓悟,只用STC89C516RD+單片機(jī)的定時器1實現(xiàn)了PWM信號的檢測。大概是這樣的:利用定時器,1ms進(jìn) ...

你的思路是對的,
1ms的確不妥, 1ms 的間隔有點(diǎn)太長了誤差可能會大。如果只是要得到頻占比的話,定時器最好是 8位自動重載模式,定時20us左右, 采樣次數(shù)盡可能的多一點(diǎn),10000以上吧,結(jié)果會比較精確。程序大致如下(供參考):

#define Duty_Value 50000  //設(shè)置量程 (0~65535) 這里定義5萬次,20us間隔,大約1秒 計算一次頻占比,
bit PWM_Done;            //標(biāo)志
unsigned short Duty_H,Duty_L,PWM_H,PWM_L,Duty_ount;   //用到的變量
sbit PWM_IO = P3^2;   //定義 PWM輸入引腳  (任意引腳)

void PWM_Get_Inti() //初始化
{
Duty_H = 0;
Duty_L = 0;
Duty_count = Duty_Value;
PWM_Done = 0;
//此處定義定時器
}

void T0_Int() interrupt 1     //中斷
{
if(PWM_IO)
{
  Duty_H++; //測量高電平比
}
else
{
  Duty_L++; //測量低電平比
}
if(--Duty_count==0)
{
  PWM_H = Duty_H; //保存高電平比
  PWM_L = Duty_L; //保存低電平比
  Duty_H = 0; //復(fù)位
  Duty_L = 0;
  Duty_count = Duty_Value;
  PWM_Done = 1;
}
}

//主程序內(nèi):
if(PWM_Done)
{
PWM_Done = 0;  //清標(biāo)志
//計算 頻占比  如:    PWM_H * 100/ Duty_Value  得出 x% 高電平比,根據(jù)需要擬定
}


回復(fù)

使用道具 舉報

ID:887371 發(fā)表于 2022-4-21 08:43 | 顯示全部樓層
樓主這辦法,pwm頻率越低,精度越高。
假如要達(dá)到100的分辨率,要遠(yuǎn)低于10Hz才行。

芯片是STC89C516RD+,外部中斷只能檢測到下降沿,

1.通過加反相器(例如一個npn管)來檢測上升沿。
2.串口不夠,可以考慮用io模擬串口。

我更傾向于用io模擬串口。
回復(fù)

使用道具 舉報

ID:1001922 發(fā)表于 2022-4-21 22:32 | 顯示全部樓層
188610329 發(fā)表于 2022-4-21 00:21
你的思路是對的,
1ms的確不妥, 1ms 的間隔有點(diǎn)太長了誤差可能會大。如果只是要得到頻占比的話,定時器 ...

其實我1ms進(jìn)入一次中斷,是怕太頻繁了,導(dǎo)致其他器件不能正常運(yùn)行。我的DIY小玩意是檢測溫度,濕度,和CO2。溫度濕度都好說,就是這個CO2的檢測麻煩。接受PWM信號用了定時器中斷,1ms中斷一次,我把檢測CO2和溫濕度代碼合在一起,然后我的我的LCD1602顯示就出問題了。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-21 22:58 | 顯示全部樓層
Ruuci 發(fā)表于 2022-4-21 22:32
其實我1ms進(jìn)入一次中斷,是怕太頻繁了,導(dǎo)致其他器件不能正常運(yùn)行。我的DIY小玩意是檢測溫度,濕度,和CO ...

你定時器中斷 1ms 進(jìn)入一次,只是讀個高低電平,然后  ++ , -- 的話,絕對不會影響 其他程序運(yùn)行的,所以,你不需要擔(dān)心 1ms 太短,影響性能, 只需要擔(dān)心 1ms 太長,準(zhǔn)確度太低的問題就可以了。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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