功能介紹放開頭, 使用便捷無需愁。
這是全網(wǎng)最詳細(xì)、性價(jià)比最高的STM32實(shí)戰(zhàn)項(xiàng)目入門教程,通過合理的硬件設(shè)計(jì)和詳細(xì)的視頻筆記介紹,硬件使用STM32F103主控資料多方便學(xué)習(xí),通過3萬字筆記、12多個小時(shí)視頻、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”**程序到單片機(jī)
? 放置之前程序控制了四個引腳 導(dǎo)致影響 電磁桿電平,拔掉板子上的紅外對管線。
使用單片機(jī)測量電壓調(diào)試
需要準(zhǔn)備的東西: 新版的沒有調(diào)試過的電磁桿、螺絲刀、小車、底板、杜邦線四根、6P的XH2.54線、攝像頭支架。
正式內(nèi)容:
這里我們先用最簡單通過完全輪詢的方式實(shí)現(xiàn)(輪詢的速度足夠普通循跡小車場景使用)
如果想通過其他方式實(shí)現(xiàn)可以參考這幾篇文章:
STM32CubeMX | HAL庫的ADC多通道數(shù)據(jù)采集(輪訓(xùn)、DMA、DMA+TIM)、讀取內(nèi)部傳感器溫度_tim+adc+dma采集-CSDN博客
【STM32】HAL庫—快速使用ADC_stm32hal庫adc輪詢-CSDN博客
采樣時(shí)間和采樣頻率的計(jì)算
ADC采樣兩點(diǎn)間隔的時(shí)間一定要大于ADC的轉(zhuǎn)換時(shí)間!
需要等待ADC完成一次轉(zhuǎn)換后,再進(jìn)行下一次采樣。如果采樣間隔時(shí)間小于ADC的轉(zhuǎn)換時(shí)間,那么你可能在一個轉(zhuǎn)換還沒有完成的情況下就開始了下一個采樣,這樣會導(dǎo)致數(shù)據(jù)丟失或者錯誤。
STM32F103 一般將時(shí)鐘配置主頻為72M、APB2為72M。ADC掛在APB2時(shí)鐘總線上,且ADC的時(shí)鐘不能超過14M。所以一般將ADC的分頻設(shè)置為6,ADC的時(shí)鐘主頻就為72/6=12MHz。那么一個周期就是:1/12MHz=0.0833us。
以下截圖為STM32F1參考手冊(手冊編號RM0008,可在ST官網(wǎng)直接搜索下載):
上圖的意思是:ADC對輸入電壓采樣若干個ADC_CLK周期,這些周期可通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位進(jìn)行修改。每個通道都可以用不同的采樣時(shí)間進(jìn)行采樣。
ADC轉(zhuǎn)換時(shí)間 = 采樣時(shí)間 + 12.5個周期
示例:
當(dāng)ADC時(shí)鐘主頻為14MHz并且采樣時(shí)間為1.5個周期時(shí):采樣時(shí)間 = 1.5 + 12.5 = 14個周期;一個周期的時(shí)間為1/14MHz,一共14個周期,1 / 14MHz * 14個周期 = 1us,那么此時(shí)ADC的采樣頻率就是1/1us=1000KHz=1MHz,這也是理論上ADC的最大采樣頻率。
STM32F1系列的時(shí)鐘主頻一般設(shè)置為了12M,采樣時(shí)間的設(shè)置所對應(yīng)采樣頻率如下圖所示:
知道了最短時(shí)間后,當(dāng)ADC時(shí)鐘主頻為12M并且采樣時(shí)間為1.5個周期時(shí),ADC采樣兩點(diǎn)的時(shí)間必須大于1.17us。
這個對我們現(xiàn)在編寫的循跡方式基本沒有影響,因?yàn)槲覀兪敲看螠y量完一組ADC,就進(jìn)行計(jì)算處理、電機(jī)控制、OLED顯示等操作,這些操作時(shí)間肯定大于采樣時(shí)間
開啟完全輪詢
將代碼文件夾"MyCode_V3.3.0" 復(fù)制到桌面或者其他沒有中文字符的路徑。
然后我們復(fù)制一份19-5_LED命名 20-2_LED 在這個上面進(jìn)行修改
打開"‘LED.ioc’" 我們把之前紅外循跡的四個GPIO做修改,改為ADC1的對應(yīng)通道。
設(shè)置ADC采集
然后點(diǎn)擊生成代碼
用keil 打開項(xiàng)目工程
先編譯一下,因?yàn)橹鞍鸭t外對管四個更改了,所以有些報(bào)錯。
需要把錯誤的注釋掉。
這里
如果還有錯誤,這個需要刪掉
然后編譯確定沒有錯誤
增加用于保存ADC變量值的
float g_fVoltage[4];//ADC電壓采集值 值對應(yīng)的四個通道和引腳分別是 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; 計(jì)算測量的電壓值 /4069是因?yàn)?096是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)通有正弦交流信號的上方,將電磁桿使用連接線,連接到底板上。
電磁桿連接線插入底板的方向如下:
插上之后是這樣的不要插反了。
擰動螺絲的同時(shí)觀察 四個通道電壓測量值的變化。
因?yàn)橥饷娴膬蓚€電感是和軌道垂直的,所以外面使用外面 兩個進(jìn)行循跡。
另一個通道的
然后把小車放置到中間,小車的v1電壓和V4電壓應(yīng)該測量值大致相同