STM32菜鳥日記5---AD轉換,stm32菜日記5---ad
首先,點擊下面的連結下載我們需要使用的代碼。連結
1.添加必要的檔案:
之前我們說過,有三個檔案是必須添加的,這三個檔案分別是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c。其中,前面的xd是根據你的晶片的容量來選擇的。這三個檔案都可以在千帆提供的代碼中找到。檔案路徑:Core.rar\Core\STM32\Source\Must 。
另外,如果想操作IO口,必須添加千帆的一個庫檔案DeviceBase.cpp。檔案路徑:Core.rar\Core\system。
2.設定Include path
這樣可以協助編譯器找到千帆庫的標頭檔。具體的設定方法我們在前面已經說過,下面是連結:我是連結,點我
3.添加AD和串口部分的代碼至工程
將千帆庫檔案中的AD部分的代碼添加到工程中(檔案:ADConvert.cpp,路徑:Core.rar\Core\system)。
將千帆庫檔案中的串口部分的代碼添加到工程中(檔案:SerialPort.cpp,路徑:Core.rar\Core\system)。
添加完成之後的Project如所示:
4.編寫代碼:
我們的實驗是將內建的AD讀取到的電壓值通過串口發送到電腦端的上位機。如果你的電腦上面沒有上位機(串口調試助手,可以點擊這裡下載)。
建立一個main.cpp(這裡一定要寫.cpp,而不是.c),在main函數中添加如下的代碼:
#include"System.h"ADConvert convert(0);int main(){convert.Start();while(1){serial.Print("AD channel 0 :%f \n",convert.ReadVoltage());Delay(1000);}}
先解釋一下STM32F103C8的硬體的AD。千帆這裡只使用了他的前8個通道(通道0~通道7)。分別對應PA0~PA7。
首先定義一個ADConvert的變數,這個變數的名字隨便起,千帆起了一個convert。後面的參數是你需要使用的通道,這裡千帆使用的是通道0,對應於與硬體上面的PA0。
當選定完通道之後就需要啟動這次AD轉換了,千帆的代碼是使用的連續轉換,即轉換完一次之後接著進行第二次轉換,直到你喊停(convert.End()函數)。當開啟通道的轉換之後如何擷取你所需要的轉換的電壓值呢?千帆這裡設定了一個函數convert.ReadVoltage()。這個函數是將你指定通道轉換完成的電壓值讀出來,返回值即是電壓值,為一個float類型的數值。讀出電壓值之後就可以將這一個電壓值發送到我們的電腦端進行顯示了。下面是千帆電腦上的:
STM32的AD轉換是一個12位的,轉換速度是很精確的。同時轉換的速度在us之內,在我們平時的學習中已經足夠了。一開始測量的是VCC(3.3V)的電壓值。方框中是千帆將介面從VCC上面拔下來,查到GND上面時候的測量資料。為什麼方框中會出現0.710596這個值呢?因為剛剛拔下的時候電壓的測量線是浮空的,這時候沒有一個固定的電平,所以說這個測量值肯定是無意義的了。下面的0是測量的GND的電壓值。這些結果還是非常滿意的。
如果你對serial這個東西不熟悉,可以看下這篇文章:連結
5.如何測量多個通道的電壓值
有的人可能想了,如果我的系統中可能需要多個電壓源的測量,我該怎麼辦呢?STM32的硬體上面提供了一個解決方案,規則群組和注入組。這個實現起來比較麻煩,千帆沒有實現。但是千帆在代碼上提出了一種解決方案,通過軟體切換的方式可以實現多個通道的電壓值的測量。這也是一種分時複用的方法。首先測量0通道的電壓值,然後切換電壓的通道(比如說通道1),然後測量通道1的電壓,周而復始,可以完成多個通道的測量。廢話不多說了,下面是代碼:
#include"System.h"ADConvert convert(0);int main(){convert.Start();while(1){convert.ChangeCh(0);serial.Print("AD channel 0 :%f \n",convert.ReadVoltage());convert.ChangeCh(1);serial.Print("AD channel 1 :%f \n",convert.ReadVoltage());Delay(1000);}}
convert.ChangeCh(int)函數可以切換通道,他的參數是需要切換的新的通道。上面的代碼中我們使用了通道0和通道1,通過軟體切換的方式測量了兩個通道,當然這裡你也可以將8個通道的電壓全部測量,只是添加幾句代碼的樣子。下面是:
千帆的通道0接了GND,通道1接了VCC。
通過這樣的方式測量電壓是不是很簡單啊。
stm32 adc轉換怎用
先做AD校準,上電之後只需校準一次,然後配置好相應IO為類比輸入模式,配置ADC的採樣頻率、取樣模式、採樣通道等,如果需要用DMA的話還得配置DMA
STM32 ADC轉換怎計算
你得到的結果是你當前AD引腳上的電壓值相對於3.3V和4096轉換成的數字.
假如你得到的AD結果是ADC_DR這個變數,他們存在以下關係:
ADC_DR/當前電壓值 = 4096/3300毫伏
如果你反過程想得到當前電壓值,可以如下計算:
unsigned long Voltage;
Voltage = ADC_DR; //---假設你得到的AD結果存放到ADC_DR這個變數中;
Voltage = (Voltage * 3300)/4096; //----你就得到了正確的電壓結果,單位是mV
一般出於效率,我會們自己進行約分:
Voltage = (Voltage * 825)/1024; //----你就得到了正確的電壓結果,單位是mV
而再進一步,效率會更高:
Voltage = (Voltage * 825)>>10; //----你就得到了正確的電壓結果,單位是mV