此實驗建立在STM32F429核心板基礎上,對於深刻了解STM32Cube使用具有深刻意義。利用DMA進行ADC采樣,具有速度快,極大減少CPU消耗的優勢,對於數據采集系統具有很大的優勢,特別是其單路2.4MSPS采樣速度,三路組合可以達到驚人的7.2MSPS采樣速度,對於一般應用均可滿足。
2.STM32Cube配置
2.1
工程建立在前面均與簡述,這里不做贅述,系統時鍾180MHz。
2.2 ADC參數配置

Scan Conversion Mode 掃描模式,當使用多通道需要使能。
Continuous Conversion Mode 連續轉化模式,當一路轉化完成立馬開始新一輪轉化。
ADC的時鍾觸發有兩種方式,一種是通過定時器等外部中斷源觸發,另一種是ADC自身的時鍾觸發。
這里選擇Timer 3 Caputure Cpmpare 1 event 觸發。

ADC通過DMA來實現數據采集,DMA Setting參數如上圖所示。這里需要注意的是Memory需要自加 1,並且使用FIFO,采用半滿閾值設置,為了做“乒乓”調度算法。因為ADC是12bit的,故采用Half Word。

開啟DMA中斷。
2.3 采樣定時脈沖設置
因為ADC使用了Timer 3,所以需要對Timer 3 進行配置。如果ADC采用內部ADC時鍾觸發,則無需配 置。


這里采用頻率設置為500KHz,定時器時鍾為180/2=90MHz,9分頻之后是10MHz,然后counter period 是20,采樣周期10M/20=500KHz。
2.4 通過STM32Cube產生源碼,使用MDK打開工程。
在大循環之前加入語句
uint16_t Samples_In[512]={0};
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&Samples_In[0],512);
3. ADC效果驗證
3.1 利用前述章節配置串口波特率115200,DMA發送使能。
3.2 在ADC的FIFO結束中斷上,關閉ADC的DMA,使其不再工作,通過串口將ADC采集到的512組16進制數據發送到PC機上,利用串口調試助手將其保存到名為“test_sina.txt”的文件中;
3.3 打開matlab軟件,新建.m文件,命名為“test_getdata.m”。
寫入語句:
clc;clear;
sina =textread(
'test_sina.txt'
,
'%s'
)';
%以字符形式打開文件
alpha = hex2dec(sina)';
%16進制轉化為10進制數,存入alpha矩陣
len = (length(alpha(1,:))+1)/2;
%len = 511;
for
i=1:1:len
s(1,i) = alpha(1,2*i-1)+alpha(1,2*i)*256;
end
x = 1:len;
plot(x,s);

信號發生器發生1KHz的正弦信號,通過MATLAB將ADC采集的數據還原如上圖所示,是一個周期多一點點的正弦波。
理論計算:500KHz的采樣率,采集1KHz的正弦信號,能夠采集1個周期多一點點,跟MATLAB顯示的一樣。
為了更加形象顯示圖像,下節會使用DAC利用“乒乓”調度算法將ADC的數據實時輸出。
附件列表