KL25的AD採集操作

2021-09-08 16:46:49 字數 1447 閱讀 2225

飛思卡爾的kl25微控制器ad做的是很不錯的,sar型能做到16位。不過資料手冊就寫得不怎麼樣了,簡直可以說是坑爹,很難看懂。有的描述讓人難以理解,你指望在別的地方對不理解的地方會有其他角度的描述,結果你發現關於同一描述,他們堅定的採用了複製貼上的辦法!擦!

而且,我還發現了資料手冊的錯誤。使用者手冊上給出了乙個案列,ad工作在16bit單端模式下adck為1mhz,但是資料手冊上註明如果ad工作在16位元模式,adck必須至少2mhz,你說這不是坑爹不是!我給官網發了郵件,他們打哈哈讓我去社群搜帖子。

結果,我看了整整一天的時間,跳過了很多不重要的功能,才能寫出ad採集**。這玩意暫存器20多個,手冊有50頁,很複雜。

我要採集的是**波,只需要1k的取樣率即可,特別低,通道為adc0_se4b。

下面是初始化**,全是配置暫存器,中間用到了飛思卡爾自己提供的自校準函式,老實說,自校準這一塊我根本沒看。本函式使用連續取樣,用到了硬體平均功能,讓採集的32點做個平均之後再儲存到結果暫存器中,目的也是降低取樣率。禁用中斷,禁用dma。

void init_adc16(void)

主函式部分

void init_adc16(void);

tadc_config master_adc_config;

int main(void)

adc0_sc1a =0x0000001f ; //停止ad取樣

for (i=0;i<216;i++)

printf("第%d點為%d", i,xinhao[i]);

return 0;

}這裡要說的是,iar除錯經常會發現單步執行和全速執行結果不一樣,這是因為缺少延時控制。尤其是對外設的操作**最容易出錯。

外設反應較慢,需要較長的時鐘週期,而cpu執行很快,它必須等待外設。比如,我們某一句**擦除flash,下一句就判斷flash的暫存器是否為0,如果單步執行這是正確的,但是全速執行就不會正確。因為單步執行的時候,步與步之間的延時使得cpu有時間擦除flash,但是全速執行的時候根本沒有這個時間。

還有,如果某一標誌位大部分時間為0,一瞬間為1表示某過程結束,**怎麼寫也是有講究的。比如ad取樣,coco標誌位在結果沒出來之前一直為0,直到結果出來了為1,我們採用查詢的方法來判斷coco的時候,正確的寫法

不是while (coco==1)

而是while (!coco); 執行。。。。。。

因為第一種寫法在coco==0的時候就會直接跳過while語句。而第二種寫法在coco==0時,會一直等到coco為1,這就是在等待外設。

使用iar還有乙個技巧。iar你的區域性變數會在用完之後被清掉。這很煩人,因為有時候你想看它們的值。乙個有效的辦法,就是在你的斷點之後,對該變數加乙個列印語句,只要有這條語句存在,區域性變數的值在執行到斷點的時候就不會被清掉。

最後貼一下ad採集到的資料:

MSP430的AD採集程式

基於msp430f169 149的雙通道ad採集程式,內部2.5v參考電壓,中斷處理方式,採用滑動平均的濾波 方式,在測試時穩定的電壓的採集中在小數點後兩位保持不動。include adc.h include stdio.h include define adc buf len 200 uint16...

AD資料採集卡的輸入懸空電壓

現象 用ad資料採集卡進行模擬電壓訊號採集時,在輸入端懸空時,其採集到的訊號與有訊號輸入的埠採集到的訊號是類似的,而不是隨機雜訊。如圖1所示。首通道是接入訊號的,某通道懸空。這裡說一下我所了解到的一種原因。大多數ad採集卡只有乙個adc晶元,當進行多路訊號採集時,是通過高速掃瞄模擬輸入通道來達到分時...

AD採集中常用的數字濾波

在ad採集中經常要用到數字濾波,而不同情況下又有不同的濾波需求,下面是10種經典的軟體濾波方法的程式和優缺點分析 1 限幅濾波法 又稱程式判斷濾波法 2 中位值濾波法 3 算術平均濾波法 4 遞推平均濾波法 又稱滑動平均濾波法 5 中位值平均濾波法 又稱防脈衝干擾平均濾波法 6 限幅平均濾波法 7 ...