|
通過(guò)改變單片機(jī)的DA輸出電壓,可以得到各種各樣的電壓波形輸出,下面介紹產(chǎn)生正弦波形需送DA的數(shù)據(jù)是如何計(jì)算的。
首先既然是正弦波,那么就要確定要輸出一個(gè)周期正弦波的采樣點(diǎn)數(shù)point,即由多少點(diǎn)組成了一周期的正弦波,還要知道單片機(jī)輸出DA的數(shù)字值maxnum是多少,比如
8位DA,maxnum=256。10位DA,maxnum=1024。
知道以上兩個(gè)值后,就開(kāi)始計(jì)算需要得到的正弦波DA數(shù)據(jù)了,我設(shè)置一個(gè)正弦波由61個(gè)點(diǎn)組成,所選DA最大數(shù)字輸入值為1024,那么我的正弦波數(shù)據(jù)數(shù)組就有61個(gè)數(shù)據(jù),即sin_tab[61],也就是把一個(gè)正弦波360度,分成了61份,那么每份就是360÷61=5.901度,這樣就可以計(jì)算出61點(diǎn)中每個(gè)點(diǎn)對(duì)應(yīng)的角度值jiaodu,有了角度值就可以算出來(lái)角度對(duì)應(yīng)的正弦值,利用正弦值和輸出DA的數(shù)字值maxnum,就可以計(jì)算出對(duì)應(yīng)DA輸入的數(shù)值了。
公式為:
sin_tab=(maxnum/2)*sin(x)+(maxnum/2); // i代表某點(diǎn) x為某角度對(duì)應(yīng)的弧度 弧度=角度*(π/180); //(maxnum/2)為正弦波零點(diǎn)處對(duì)應(yīng)DA輸入值;即DA滿量程的一半;
在51單片機(jī)運(yùn)行了以下函數(shù),DA輸出波形完美,驗(yàn)證產(chǎn)生的DA數(shù)據(jù)無(wú)誤。
- #include<math.h> //注意需添加此頭文件,包含了求正弦值函數(shù)sin(弧度值);
- //獲取不同點(diǎn)數(shù)的正弦波數(shù)據(jù)
- //point: 一周期內(nèi)的取樣點(diǎn)數(shù)
- //maxnum: 一周期內(nèi)對(duì)應(yīng)DA輸出最大值
- void getSinTab(uchar point,uint maxnum)
- {
- uchar i=0;
- float x; //弧度
- float jiao;//角度 分度角
- jiao=360.000/point;
- for(i=0;i<point;i++)
- {
- x=jiao*i; //得到角度值
- x=x*0.01744; //角度轉(zhuǎn)弧度 弧度=角度*(π/180)
- sin_tab[i]=(maxnum/2)*sin(x)+(maxnum/2);
- }
- }
- // sin_tab[i] 為得到的正弦波數(shù)據(jù),用于送給DA輸出。
復(fù)制代碼
|
|