我用AT89C51來產生PWM……麻煩了,做不出來
求助!!!!
謝謝
我用AT89C51來產生PWM……麻煩了,做不出來
全部回復(40)
正序查看
倒序查看
理論可以,不過標準51的話1us為最小指令周期-》1M,去掉中斷響應:至少一個周期吧第一個長跳轉:好像是3個周期?push 若干個查表(計算)若干個賦值若干個pop XX 若干個最后中斷返回:1個還是兩個?如果還要求是中心對齊的PWM,能產生10K的PWM都勉強,像你說的:你有麻煩了,如果你再用C而不是匯編 ^_^ 你有麻煩了.這還有分辨率的事沒說呢!此路不通! 有一次逼得我就在T2中斷入口后面直接寫-沒長跳轉,節省3個周期,不過是我錯了,因為是可以用常熟自動裝載的.用DSP吧,不過我現在還不會.2407大約就幾十K,所以現在出28XX了.數字電路的晶體頻率聽起來很嚇人,一算下來:我有麻煩了.
0
回復
@qihao
理論可以,不過標準51的話1us為最小指令周期-》1M,去掉中斷響應:至少一個周期吧第一個長跳轉:好像是3個周期?push 若干個查表(計算)若干個賦值若干個pop XX 若干個最后中斷返回:1個還是兩個?如果還要求是中心對齊的PWM,能產生10K的PWM都勉強,像你說的:你有麻煩了,如果你再用C而不是匯編 ^_^ 你有麻煩了.這還有分辨率的事沒說呢!此路不通! 有一次逼得我就在T2中斷入口后面直接寫-沒長跳轉,節省3個周期,不過是我錯了,因為是可以用常熟自動裝載的.用DSP吧,不過我現在還不會.2407大約就幾十K,所以現在出28XX了.數字電路的晶體頻率聽起來很嚇人,一算下來:我有麻煩了.
聽到你說“此路不通”好傷心啊……
不過現在就是用標準51,匯編語言編程.
如果分辨率可調整的話,那你覺得要考慮哪些問題呢?
我現在是要它行的通……只是我還行不通
不過現在就是用標準51,匯編語言編程.
如果分辨率可調整的話,那你覺得要考慮哪些問題呢?
我現在是要它行的通……只是我還行不通
0
回復
@qiuyy
這個應該是可以做的吧.你首先要定義兩個變量:一個是叫周期T,另一外一個占空比D.T的值要大于D,首先讓I/O口輸出高電平,讓T,D同進計數,當D已經到了預計值的時候,則I/0變為低,然后低電平一直延續到T的值.當T的值到的時候,I/O口拉高.改變D,T的時間可以控制頻率,改變D的值可以達到占空比的變化.這個思路很重要.這種算法要用到定時器,只要單片機時鐘頻率足夠高,可以任意改變PWM的頻率.
TO qinuyy: 現在我是要用MCS-5系列單片機,軟件編程實現脈寬調制PWM的正弦波,然后根據串行口的高、低電平產生頻移鍵控信號并發送,最終實現CPFSK的調制...
如你所說,我必須選擇帶有AD轉換,PWM模塊的51系列芯片,要不沒有辦法檢測電壓電流……這里我有點不懂...請指教!!!
謝謝!!!
如你所說,我必須選擇帶有AD轉換,PWM模塊的51系列芯片,要不沒有辦法檢測電壓電流……這里我有點不懂...請指教!!!
謝謝!!!
0
回復
@qihao
"頻移鍵控信號"是什么樣的信號,說來聽聽,我也感興趣,大家來評估一下實現方法.如果不是用來做開關電源,也許行,我以為你是說做開關電源呢
二進制數字頻率調制(2FSK)是利用二進制數字基帶信號控制載波的頻率進行頻譜變換的過程.在發送端,產生不同頻率的載波振蕩來傳輸數字信息“1”或“0”,在接收端,不不同頻率的載波振蕩還原成響應的數字基帶信號.FSK有相位連續(CPFSK)和相位不連續(DPFSK)之分.
在這里所說的CPFSK,就是相位連續的頻移鍵控調制.
現在就是計劃用MCS51系列單片機來產生一路PWM信號(或者兩路),不是用來做開關電源的..
請問有什么可行的辦法?
我還沒有做出來..
謝謝!
在這里所說的CPFSK,就是相位連續的頻移鍵控調制.
現在就是計劃用MCS51系列單片機來產生一路PWM信號(或者兩路),不是用來做開關電源的..
請問有什么可行的辦法?
我還沒有做出來..
謝謝!
0
回復
@清泉石上流
二進制數字頻率調制(2FSK)是利用二進制數字基帶信號控制載波的頻率進行頻譜變換的過程.在發送端,產生不同頻率的載波振蕩來傳輸數字信息“1”或“0”,在接收端,不不同頻率的載波振蕩還原成響應的數字基帶信號.FSK有相位連續(CPFSK)和相位不連續(DPFSK)之分. 在這里所說的CPFSK,就是相位連續的頻移鍵控調制. 現在就是計劃用MCS51系列單片機來產生一路PWM信號(或者兩路),不是用來做開關電源的.. 請問有什么可行的辦法? 我還沒有做出來.. 謝謝!
是不是就是調頻信號:一個頻率表示1,一個表示0?
哪就是可以用常數自動裝載,AT的T2可以的,這個時atmel擴展的標準51功能,以前我用來發生紅外調制基波,估計能是你說的那樣.記住:常數自動裝載,CPU設定一次后無需再干預
不過解調呢? 測脈寬來解調?忘了當時咋做的
哪就是可以用常數自動裝載,AT的T2可以的,這個時atmel擴展的標準51功能,以前我用來發生紅外調制基波,估計能是你說的那樣.記住:常數自動裝載,CPU設定一次后無需再干預
不過解調呢? 測脈寬來解調?忘了當時咋做的
0
回復
@qihao
其實搭兩個方波振蕩,用串口數據直接控制一個電子開關呢?發送CPU就免干預了,只要做解調工作
TO qiuyy:
如你所說,就是用中斷的方式來實現吧.如果是采用查表的方式的實現,會不會很麻煩?
500) {this.resized=true; this.width=500; this.alt='這是一張縮略圖,點擊可放大。\n按住CTRL,滾動鼠標滾輪可自由縮放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/28/1112967578.gif');}" onmousewheel="return imgzoom(this);">
正弦波PWM調制就是使調制出的波形盡可能接近正弦波.象上圖的那樣,在調制過程中使每個時段內上下圖對應的陰影部分面積相等.由于正弦波是對稱的,那就要求時段的分割數是偶數.如果采取這種方式的話,那是不是要用查詢的方式來完成?這樣的話,那不是要占用大量的內存來存放數據嗎?就假設單片機的時鐘頻率為12MHz,調制時段數分到52的話……
能說說各自的出發點所在嗎?
謝謝!
如你所說,就是用中斷的方式來實現吧.如果是采用查表的方式的實現,會不會很麻煩?

正弦波PWM調制就是使調制出的波形盡可能接近正弦波.象上圖的那樣,在調制過程中使每個時段內上下圖對應的陰影部分面積相等.由于正弦波是對稱的,那就要求時段的分割數是偶數.如果采取這種方式的話,那是不是要用查詢的方式來完成?這樣的話,那不是要占用大量的內存來存放數據嗎?就假設單片機的時鐘頻率為12MHz,調制時段數分到52的話……
能說說各自的出發點所在嗎?
謝謝!
0
回復
@清泉石上流
TO qiuyy: 如你所說,就是用中斷的方式來實現吧.如果是采用查表的方式的實現,會不會很麻煩? [圖片]500){this.resized=true;this.width=500;this.alt='這是一張縮略圖,點擊可放大。\n按住CTRL,滾動鼠標滾輪可自由縮放';this.style.cursor='hand'}"onclick="if(!this.resized){returntrue;}else{window.open('http://u.dianyuan.com/bbs/u/28/1112967578.gif');}"onmousewheel="returnimgzoom(this);"> 正弦波PWM調制就是使調制出的波形盡可能接近正弦波.象上圖的那樣,在調制過程中使每個時段內上下圖對應的陰影部分面積相等.由于正弦波是對稱的,那就要求時段的分割數是偶數.如果采取這種方式的話,那是不是要用查詢的方式來完成?這樣的話,那不是要占用大量的內存來存放數據嗎?就假設單片機的時鐘頻率為12MHz,調制時段數分到52的話…… 能說說各自的出發點所在嗎? 謝謝!
你把要調制的數據變成表格也可以的.首先你要明白什么是PWM,好好地分析D(占空比)和T(周期)的關系.再構思一下.這個算法也是我以前想出來的.當然如果你要用程序做成正弦的話,你可以選用DA轉換,這也個也不難做.
0
回復
@grtang
thankyourhelp.
TO qiuyy:
謝謝您!我明白您的意思.
假設MCS51的串行數據速率I(由軟件設置,硬件自動產生MOV SCON ****),數據電平“1”的調制頻率為f1,數據電平“0”的調制頻率為f0,通過軟件檢測MCS51的串行數據輸出端口TXD對數據進行調制.
首先讓I/O口(如P1.3)輸出高電平,然后檢測TXD.當TXD輸出為“1”時,進行頻率為f1的調制;當TXD輸出為“0”時,進行頻率為f0的調制.接著讓I/O口(如P1.3)輸出低電平,并檢測TXD,重復上面的步驟.這樣的話,要實現PWM輸出,還是用中斷來實現嗎?
你所說的占空比和數據電平的調制頻率f0、f1有什么必然的聯系?
PWM輸出后經穩壓、濾波,就可得到經過調制的相位連續正弦波.
謝謝您!我明白您的意思.
假設MCS51的串行數據速率I(由軟件設置,硬件自動產生MOV SCON ****),數據電平“1”的調制頻率為f1,數據電平“0”的調制頻率為f0,通過軟件檢測MCS51的串行數據輸出端口TXD對數據進行調制.
首先讓I/O口(如P1.3)輸出高電平,然后檢測TXD.當TXD輸出為“1”時,進行頻率為f1的調制;當TXD輸出為“0”時,進行頻率為f0的調制.接著讓I/O口(如P1.3)輸出低電平,并檢測TXD,重復上面的步驟.這樣的話,要實現PWM輸出,還是用中斷來實現嗎?
你所說的占空比和數據電平的調制頻率f0、f1有什么必然的聯系?
PWM輸出后經穩壓、濾波,就可得到經過調制的相位連續正弦波.
0
回復
@清泉石上流
TOqiuyy: 謝謝您!我明白您的意思. 假設MCS51的串行數據速率I(由軟件設置,硬件自動產生MOVSCON****),數據電平“1”的調制頻率為f1,數據電平“0”的調制頻率為f0,通過軟件檢測MCS51的串行數據輸出端口TXD對數據進行調制. 首先讓I/O口(如P1.3)輸出高電平,然后檢測TXD.當TXD輸出為“1”時,進行頻率為f1的調制;當TXD輸出為“0”時,進行頻率為f0的調制.接著讓I/O口(如P1.3)輸出低電平,并檢測TXD,重復上面的步驟.這樣的話,要實現PWM輸出,還是用中斷來實現嗎? 你所說的占空比和數據電平的調制頻率f0、f1有什么必然的聯系? PWM輸出后經穩壓、濾波,就可得到經過調制的相位連續正弦波.
的確有水平!
0
回復
@清泉石上流
TOqiuyy: 謝謝您!我明白您的意思. 假設MCS51的串行數據速率I(由軟件設置,硬件自動產生MOVSCON****),數據電平“1”的調制頻率為f1,數據電平“0”的調制頻率為f0,通過軟件檢測MCS51的串行數據輸出端口TXD對數據進行調制. 首先讓I/O口(如P1.3)輸出高電平,然后檢測TXD.當TXD輸出為“1”時,進行頻率為f1的調制;當TXD輸出為“0”時,進行頻率為f0的調制.接著讓I/O口(如P1.3)輸出低電平,并檢測TXD,重復上面的步驟.這樣的話,要實現PWM輸出,還是用中斷來實現嗎? 你所說的占空比和數據電平的調制頻率f0、f1有什么必然的聯系? PWM輸出后經穩壓、濾波,就可得到經過調制的相位連續正弦波.
it's also a good wayt to produce the PLUS Of PWM.But the F is limited!
0
回復
@qihao
理論可以,不過標準51的話1us為最小指令周期-》1M,去掉中斷響應:至少一個周期吧第一個長跳轉:好像是3個周期?push 若干個查表(計算)若干個賦值若干個pop XX 若干個最后中斷返回:1個還是兩個?如果還要求是中心對齊的PWM,能產生10K的PWM都勉強,像你說的:你有麻煩了,如果你再用C而不是匯編 ^_^ 你有麻煩了.這還有分辨率的事沒說呢!此路不通! 有一次逼得我就在T2中斷入口后面直接寫-沒長跳轉,節省3個周期,不過是我錯了,因為是可以用常熟自動裝載的.用DSP吧,不過我現在還不會.2407大約就幾十K,所以現在出28XX了.數字電路的晶體頻率聽起來很嚇人,一算下來:我有麻煩了.
用P4,大概就沒問題吧?
0
回復
@清泉石上流
limited? Howto increasetheF?byusinganotherone-chip?
TO qiuyy:您好!非常感謝您提供的思路!
●●可變脈寬PWM輸出
用T0定時器控制PWM的占空比,T1定時器控制脈寬(最大65536μs.)
T0、T1定時器設置成16位定時器.
程序清單:(12MHz)
PwmData0 ;T0定時t1的初值(字)
PwmData1 ;T1定時T的初值(字)
;***************************
setb tro ;啟動T0
setb tr1
……
T0Int:Clr tr0 ;T0中斷服務程序
setb p1.0 ;PWM輸出腳
reti
T1Int:Clr p1.0 ;T1中斷服務程序
Clr tr0
Clr tr1
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Mov TH1,High(PwmData1)
Mov TL1,Low(PwmData1)
Setb tr1
Setb tr0
reti
說明:在主程序中計算PwmData0、PwmData1的值.
我有一個疑問:利用單片機MCS51實現可變脈寬PWM輸出時,在主程序中計算PwmData0、PwmData1的值過程中,是采用查表的方式,還是動態計算呢?因為在每一次T1產生中斷后,T1所裝載的值都會改變,這樣,假如:
1)采用查表的方式,那么就必須在T1INT程序段中加入讀表、裝載指令.那么大量的數據表就會占用了大量的存儲單元,并且煩瑣容易弄錯.
2)采用動態計算,則需要在主程序中進行算術運算,并實現二進制向十六進制的轉換,然后再裝載進T1中,也很煩瑣……
而且這樣的話,會不會有時間上的延時問題?
另外還問一個弱弱的問題:單片機的串行輸出口TXD能不能自動產生一系列的不規則的數字信號?應該如何實現呢??
請指點!!!
●●可變脈寬PWM輸出
用T0定時器控制PWM的占空比,T1定時器控制脈寬(最大65536μs.)
T0、T1定時器設置成16位定時器.
程序清單:(12MHz)
PwmData0 ;T0定時t1的初值(字)
PwmData1 ;T1定時T的初值(字)
;***************************
setb tro ;啟動T0
setb tr1
……
T0Int:Clr tr0 ;T0中斷服務程序
setb p1.0 ;PWM輸出腳
reti
T1Int:Clr p1.0 ;T1中斷服務程序
Clr tr0
Clr tr1
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Mov TH1,High(PwmData1)
Mov TL1,Low(PwmData1)
Setb tr1
Setb tr0
reti
說明:在主程序中計算PwmData0、PwmData1的值.
我有一個疑問:利用單片機MCS51實現可變脈寬PWM輸出時,在主程序中計算PwmData0、PwmData1的值過程中,是采用查表的方式,還是動態計算呢?因為在每一次T1產生中斷后,T1所裝載的值都會改變,這樣,假如:
1)采用查表的方式,那么就必須在T1INT程序段中加入讀表、裝載指令.那么大量的數據表就會占用了大量的存儲單元,并且煩瑣容易弄錯.
2)采用動態計算,則需要在主程序中進行算術運算,并實現二進制向十六進制的轉換,然后再裝載進T1中,也很煩瑣……
而且這樣的話,會不會有時間上的延時問題?
另外還問一個弱弱的問題:單片機的串行輸出口TXD能不能自動產生一系列的不規則的數字信號?應該如何實現呢??
請指點!!!
0
回復
@清泉石上流
TOqiuyy:您好!非常感謝您提供的思路! ●●可變脈寬PWM輸出 用T0定時器控制PWM的占空比,T1定時器控制脈寬(最大65536μs.) T0、T1定時器設置成16位定時器. 程序清單:(12MHz) PwmData0 ;T0定時t1的初值(字) PwmData1 ;T1定時T的初值(字);*************************** setbtro ;啟動T0 setbtr1 ……T0Int:Clr tr0 ;T0中斷服務程序 setb p1.0 ;PWM輸出腳 retiT1Int:Clr p1.0 ;T1中斷服務程序 Clrtr0 Clrtr1 MovTH0,High(PwmData0) MovTL0,Low(PwmData0) MovTH1,High(PwmData1) MovTL1,Low(PwmData1) Setbtr1 Setbtr0 reti 說明:在主程序中計算PwmData0、PwmData1的值. 我有一個疑問:利用單片機MCS51實現可變脈寬PWM輸出時,在主程序中計算PwmData0、PwmData1的值過程中,是采用查表的方式,還是動態計算呢?因為在每一次T1產生中斷后,T1所裝載的值都會改變,這樣,假如: 1)采用查表的方式,那么就必須在T1INT程序段中加入讀表、裝載指令.那么大量的數據表就會占用了大量的存儲單元,并且煩瑣容易弄錯. 2)采用動態計算,則需要在主程序中進行算術運算,并實現二進制向十六進制的轉換,然后再裝載進T1中,也很煩瑣…… 而且這樣的話,會不會有時間上的延時問題? 另外還問一個弱弱的問題:單片機的串行輸出口TXD能不能自動產生一系列的不規則的數字信號?應該如何實現呢?? 請指點!!!
我想你用串口實現的話是可以實現一系列不規則的數字的.比如你裝載不同的數據的時候.另外用查表和動態度計算的優點,要試試才知道.
0
回復