功能介紹放開頭, 使用便捷無需愁。
這是全網(wǎng)最詳細、性價比最高的STM32實戰(zhàn)項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字筆記、12多個小時視頻、20多章節(jié)代碼手把手教會你如何開發(fā)和調(diào)試。讓你更快掌握嵌入式系統(tǒng)開發(fā)。
V3.3.0-STM32智能小車
視頻: https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click
V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。
使用示波器調(diào)試(如果沒有示波器可以不跟著做這節(jié))
使用萬用表調(diào)試(如果沒有萬用表可以不跟著做這節(jié))
- 先燒錄**“20-2_LED”**程序到單片機
? 放置之前程序控制了四個引腳 導致影響 電磁桿電平,拔掉板子上的紅外對管線。
使用單片機測量電壓調(diào)試
需要準備的東西: 新版的沒有調(diào)試過的電磁桿、螺絲刀、小車、底板、杜邦線四根、6P的XH2.54線、攝像頭支架。
正式內(nèi)容:
這里我們先用最簡單通過完全輪詢的方式實現(xiàn)(輪詢的速度足夠普通循跡小車場景使用)
如果想通過其他方式實現(xiàn)可以參考這幾篇文章:
STM32CubeMX | HAL庫的ADC多通道數(shù)據(jù)采集(輪訓、DMA、DMA+TIM)、讀取內(nèi)部傳感器溫度_tim+adc+dma采集-CSDN博客
【STM32】HAL庫—快速使用ADC_stm32hal庫adc輪詢-CSDN博客
采樣時間和采樣頻率的計算
ADC采樣兩點間隔的時間一定要大于ADC的轉(zhuǎn)換時間!
需要等待ADC完成一次轉(zhuǎn)換后,再進行下一次采樣。如果采樣間隔時間小于ADC的轉(zhuǎn)換時間,那么你可能在一個轉(zhuǎn)換還沒有完成的情況下就開始了下一個采樣,這樣會導致數(shù)據(jù)丟失或者錯誤。
STM32F103 一般將時鐘配置主頻為72M、APB2為72M。ADC掛在APB2時鐘總線上,且ADC的時鐘不能超過14M。所以一般將ADC的分頻設置為6,ADC的時鐘主頻就為72/6=12MHz。那么一個周期就是:1/12MHz=0.0833us。
以下截圖為STM32F1參考手冊(手冊編號RM0008,可在ST官網(wǎng)直接搜索下載):
上圖的意思是:ADC對輸入電壓采樣若干個ADC_CLK周期,這些周期可通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位進行修改。每個通道都可以用不同的采樣時間進行采樣。
ADC轉(zhuǎn)換時間 = 采樣時間 + 12.5個周期
示例:
當ADC時鐘主頻為14MHz并且采樣時間為1.5個周期時:采樣時間 = 1.5 + 12.5 = 14個周期;一個周期的時間為1/14MHz,一共14個周期,1 / 14MHz * 14個周期 = 1us,那么此時ADC的采樣頻率就是1/1us=1000KHz=1MHz,這也是理論上ADC的最大采樣頻率。
STM32F1系列的時鐘主頻一般設置為了12M,采樣時間的設置所對應采樣頻率如下圖所示:
知道了最短時間后,當ADC時鐘主頻為12M并且采樣時間為1.5個周期時,ADC采樣兩點的時間必須大于1.17us。
這個對我們現(xiàn)在編寫的循跡方式基本沒有影響,因為我們是每次測量完一組ADC,就進行計算處理、電機控制、OLED顯示等操作,這些操作時間肯定大于采樣時間
開啟完全輪詢
將代碼文件夾"MyCode_V3.3.0" 復制到桌面或者其他沒有中文字符的路徑。
然后我們復制一份19-5_LED命名 20-2_LED 在這個上面進行修改
打開"‘LED.ioc’" 我們把之前紅外循跡的四個GPIO做修改,改為ADC1的對應通道。
設置ADC采集
然后點擊生成代碼
用keil 打開項目工程
先編譯一下,因為之前把紅外對管四個更改了,所以有些報錯。
需要把錯誤的注釋掉。
這里
如果還有錯誤,這個需要刪掉
然后編譯確定沒有錯誤
增加用于保存ADC變量值的
float g_fVoltage[4];//ADC電壓采集值 值對應的四個通道和引腳分別是 ADC1_NI5 PA5 、ADC1_NI7 PA7、ADC1_NI8 PB0、ADC1_NI9 PB1
我們把模式0顯示6050的代碼注釋掉
然后我們添加代碼,把采集的數(shù)據(jù)顯示在屏幕上
//采集四個通道電壓值
for(int i=0;i<4;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
g_fVoltage[i]=(float)HAL_ADC_GetValue(&hadc1)/4096*3.300; 計算測量的電壓值 /4069是因為4096是12位ADC的最大值(即2^12)、*3.300 是將歸一化的數(shù)值乘以參考電壓
}
sprintf((char *)OledString,"v1:%.2f v2:%.2f rn",g_fVoltage[0],g_fVoltage[1]);//顯示 1、2 電壓值
OLED_ShowString(0,4,OledString,12);//這個是oled驅(qū)動里面的,是顯示位置的一個函數(shù),
sprintf((char *)OledString,"v3:%.2f v4:%.2f rn",g_fVoltage[2],g_fVoltage[3]);//顯示3、4 電壓值
OLED_ShowString(0,5,OledString,12);//這個是oled驅(qū)動里面的,是顯示位置的一個函數(shù),
然后代碼燒錄一下,可以用一根杜邦線,把3.3和其中一個引腳B0接到一起(注意不要把GND和3.3J接到一起)。
然后OLED對V3就會顯示3.30左右
注意:
- 不要把3.3和GND引腳用杜邦線插一起。
- 把四個紅外對管都要拔掉。
然后我們把電磁循跡桿 放置到已經(jīng)通有正弦交流信號的上方,將電磁桿使用連接線,連接到底板上。
電磁桿連接線插入底板的方向如下:
插上之后是這樣的不要插反了。
擰動螺絲的同時觀察 四個通道電壓測量值的變化。
因為外面的兩個電感是和軌道垂直的,所以外面使用外面 兩個進行循跡。
另一個通道的
然后把小車放置到中間,小車的v1電壓和V4電壓應該測量值大致相同