摘要:灰度傳感器利用不同顏色的檢測面對光的反射程度不同的原理進(jìn)行顏色深淺檢測。這就是我們用的數(shù)字量灰度傳感器。數(shù)字量的灰度傳感器如果加入的是單片機(jī)處理數(shù)據(jù),那么可以把得到的原始數(shù)據(jù)加入濾波算法數(shù)據(jù)混合算法得到一個(gè)波動(dòng)小適應(yīng)環(huán)境強(qiáng)的數(shù)字傳感器。
文章目錄
引言
1.尋跡傳感器工作原理介紹
2.使用方法
3.代碼實(shí)現(xiàn)
引言:
? ? 基于剛剛結(jié)束的工創(chuàng)賽給大家分享一下我們的傳感器選擇方案
一、尋跡傳感器工作原理介紹
? ? ? ?灰度傳感器有數(shù)字傳感器和模擬傳感器兩種,其原理大致相同。原理:一只發(fā)光二極管和一只光敏二極管,安裝在同一面上?;叶葌鞲衅骼貌煌伾臋z測面對光的反射程度不同的原理進(jìn)行顏色深淺檢測。在有效的檢測距離內(nèi)(理論上距離可以無限遠(yuǎn),實(shí)際受外界光源的影響,最佳距離為15mm至50mm,如果距離過高的話,需要進(jìn)行遮光),發(fā)光二極管發(fā)出的光,照射在檢測面上,檢測面反射部分光線,光敏二極管檢測此光線的強(qiáng)度并將其轉(zhuǎn)換為單片機(jī)可以識(shí)別的電信號(hào)。這個(gè)電信號(hào)是一個(gè)模擬值,單片機(jī)可以根據(jù)模擬值的大小進(jìn)行二值化處理,也就是給一個(gè)電平分界線,當(dāng)電壓大于一個(gè)值的時(shí)候給一個(gè)高電平(或低電平),當(dāng)電壓小于一個(gè)值的時(shí)候給一個(gè)低電平(或高電平)。當(dāng)然這里可以用電壓比較器作為電平的參考電壓。這就是我們用的數(shù)字量灰度傳感器。數(shù)字量的灰度傳感器如果加入的是單片機(jī)處理數(shù)據(jù),那么可以把得到的原始數(shù)據(jù)加入濾波算法、數(shù)據(jù)混合算法得到一個(gè)波動(dòng)小、適應(yīng)環(huán)境強(qiáng)的數(shù)字傳感器。 如果對采集的原始的數(shù)據(jù)不做處理,那么就是模擬值輸出。也就是我們的模擬量灰度傳感器。因?yàn)槊柯穫鞲衅飨嗷ブg都是有誤差的,所以同樣的條件下模擬值肯定不是一樣。
作為我們使用者來說一般知道怎么用就可以了(說點(diǎn)人話)簡單來說智能款傳感器有兩種輸出方式
第一種是通過gpio輸出高低電平5v/3.3v(例如傳感器在黑線上輸出高電平,不在黑線上輸出低電平)
第二種是串口通信,因?yàn)樵谥悄芸顐鞲衅魃嫌幸活wmcu通過自身的采集和計(jì)算可以采集到傳感器的狀態(tài),而我們要做的就是用我們的主板與傳感器的主板通信就可以來知道我們想知道的傳感器的狀態(tài)就可以了。
?2.使用方法
接下來給大家講一下使用方法(僅供參考)
作為一個(gè)麥輪車要想進(jìn)準(zhǔn)的定位首先就是位置狀態(tài)足夠多從而實(shí)現(xiàn)位置閉環(huán),如果采用第一種gpio輸出高低電平的話,那么一路對應(yīng)著一路引腳,四個(gè)7路就是28個(gè)引腳,太占引腳而且麻煩,所以我們采用第二種串口通信的方式,stm32f103這個(gè)型號(hào)的板子有5路硬件串口,四路作為與傳感器通信,一路與我們的上位機(jī)通信處理數(shù)據(jù)和計(jì)算從而改變車身校正。
提供一個(gè)思路
第一步配置cubemx的串口
首先配置RCC、SYS、clock(這里跳過了)
?
?
然后生成項(xiàng)目文件打開
3.代碼實(shí)現(xiàn)
1.主函數(shù)代碼
int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); MX_UART4_Init(); MX_UART5_Init(); /* USER CODE BEGIN 2 */delay_ms(1000);HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000);//串口2發(fā)送函數(shù)HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);//串口1接收函數(shù)HAL_UART_Receive_IT(&huart5,&Rx_dat2,1);//串口5接收函數(shù)HAL_UART_Receive_IT(&huart3,&Rx_dat3,1);//串口3接收函數(shù) HAL_UART_Receive_IT(&huart2,&Rx_dat,1); //串口2接收函數(shù) /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}
?2.串口中斷代碼
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if((huart->Instance)==USART1) { if(Rx_mcu==0x00) {chuan_flag=0; Rx_dat=0; Rx_dat2=0; Rx_dat3=0; wink=0; } if(Rx_mcu==0x31) {chuan_flag=1; } if(Rx_mcu==0x32) {chuan_flag=2; } if(Rx_mcu==0x33) {chuan_flag=3; } if(Rx_mcu==0x34) {chuan_flag=4; } if(Rx_mcu==0x35) {chuan_flag=5; } if(Rx_mcu==0x36) {qq=1; chuan_flag=6; } if(Rx_mcu==0x37) {qq=0; chuan_flag=7; } if(Rx_mcu==0x38) {qq=0; chuan_flag=8; } if(Rx_mcu==0x39) {qq=0; chuan_flag=9; } if(Rx_mcu==0x3a) {qq=0; chuan_flag=10; } if(Rx_mcu==0x3b) {qq=0; chuan_flag=11; } if(Rx_mcu==0x3c) {qq=1; chuan_flag=12; } if(Rx_mcu==0x3d) {qq=0; chuan_flag=13; } if(Rx_mcu==0x3e) {qq=0; chuan_flag=14; } if(Rx_mcu==0x3f) {qq=1; chuan_flag=15; } if(Rx_mcu==0x40) {qq=0; chuan_flag=16; } if(Rx_mcu==0x41) {qq=0; chuan_flag=17; } if(Rx_mcu==0x42) {qq=1; chuan_flag=18; } if(Rx_mcu==0x43) {qq=0; chuan_flag=19; } send_data(); HAL_UART_Receive_IT(&huart1,&Rx_mcu,1); } if((huart->Instance)==UART5) { if(chuan_flag==4) {if(Rx_dat2 == 0x40) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); }} if(chuan_flag==5) {if(Rx_dat2 == 0x7f) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); }} if(chuan_flag==7) { if(chu_or_jue==chu) { if(Rx_dat2 == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); } if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000); } } if(chu_or_jue==jue) { if(Rx_dat2 == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } } if(chuan_flag==9) {if(Rx_dat2 == 0x40) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); }} if(chuan_flag==10) {if(Rx_dat2 != 0x40&&Rx_dat2 != 0x20&&Rx_dat2 != 0x60) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); } } if(chuan_flag==13) { if(Rx_dat2 == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); } if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000); } wink++; } else if(chuan_flag==14) {if(Rx_dat2 == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000); }} else if(chuan_flag==17) {if(Rx_dat2 == 0x01||Rx_dat2 == 0x02||Rx_dat2 == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } if(Rx_dat2 == 0x40||Rx_dat2 == 0x20||Rx_dat2 == 0x30) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } } HAL_UART_Transmit(&huart5,&Tx_strcc,sizeof(Tx_strcc),10000);HAL_UART_Receive_IT(&huart5,&Rx_dat2,1); } if((huart->Instance)==USART3) { if(chuan_flag==6) {if(Rx_dat3 == 0x7f) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); }} else if(chuan_flag==18) {if(Rx_dat3 == 0x01||Rx_dat3 == 0x02||Rx_dat3 == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } if(Rx_dat3 == 0x40||Rx_dat3 == 0x20||Rx_dat3 == 0x30) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } } HAL_UART_Transmit(&huart3,&Tx_strcc,sizeof(Tx_strcc),10000); HAL_UART_Receive_IT(&huart3,&Rx_dat3,1); } if((huart->Instance)==USART2) { if(chuan_flag==1) {if(Rx_dat == 0x08||Rx_dat == 0x04||Rx_dat == 0x0c) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); }} if(chuan_flag==2) {if(Rx_dat == 0x7f) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); }} if(chuan_flag==3) { if(Rx_dat != 0x7f) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } if(Rx_dat == 0x7f) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); }} if(chuan_flag==8) {if(Rx_dat == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); }} if(chuan_flag==11) { if(Rx_dat == 0x08) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } if(Rx_dat == 0x04||Rx_dat == 0x0c||Rx_dat == 0x02||Rx_dat == 0x01||Rx_dat == 0x06||Rx_dat == 0x07||Rx_dat == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000); } if(Rx_dat >= 0x10||Rx_dat == 0x18||Rx_dat == 0x20||Rx_dat == 0x40||Rx_dat == 0x30||Rx_dat == 0x60||Rx_dat == 0x70) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000); } wink++; } if(chuan_flag==12) {if(Rx_dat == 0x3f) {HAL_UART_Transmit(&huart1,&Tx_0x37,sizeof(Tx_0x37),10000); } } else if(chuan_flag==15) {if(Rx_dat == 0x40) {HAL_UART_Transmit(&huart1,&Tx_0x35,sizeof(Tx_0x35),10000); }} else if(chuan_flag==16) {if(Rx_dat == 0x01||Rx_dat == 0x02||Rx_dat == 0x03) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } if(Rx_dat == 0x40||Rx_dat == 0x20||Rx_dat == 0x30) {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); } } if(chuan_flag==19) {if(Rx_dat == 0x20||Rx_dat == 0x30) {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000); } } if(chu_or_jue==1) { HAL_UART_Receive_IT(&huart1,&Rx_mcu,1); } HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000); HAL_UART_Receive_IT(&huart2,&Rx_dat,1); }
(大家僅供參考)這個(gè)是當(dāng)時(shí)我當(dāng)時(shí)做的所有的位置當(dāng)時(shí)用到哪個(gè)位置就就寫到哪了有點(diǎn)亂哈=.=
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121784.html
摘要:前言傳感器工作原理代碼部分電機(jī)初始化延遲初始化電機(jī)管腳初始化尋跡管腳初始化。電機(jī)管腳初始化函數(shù)定義管腳的結(jié)構(gòu)體打開所要使用的時(shí)鐘將管腳特殊功能關(guān)掉配置管腳的參數(shù),用于驅(qū)動(dòng)電機(jī)。配置管腳的參數(shù)紅外傳感器。 前言:傳感器工作原理: 代碼部分:? ? main.c #include motor....
摘要:總線掛載的外設(shè)有等。外設(shè)地址映射片上外設(shè)區(qū)分為三條總線,根據(jù)外設(shè)速度的不同,不同總線掛載著不同的外設(shè),掛載低速外設(shè),和掛載高速外設(shè)。 第二章 STM32資源介紹 2...
基于STM32f103c8t6和L292N驅(qū)動(dòng)設(shè)計(jì)避障小車(核心函數(shù)的建立為自己所寫) 一.項(xiàng)目感觸 完成這個(gè)項(xiàng)目自己一開始也是無法從本身上出發(fā),看著這個(gè)最小系統(tǒng)板和這個(gè)電機(jī)驅(qū)動(dòng)模塊上面想著怎樣實(shí)現(xiàn)讓這兩塊板子實(shí)現(xiàn)四個(gè)電機(jī)上面轉(zhuǎn)動(dòng)呢,還要加入避障模塊,自己一開始一頭霧水,于是開始了漫長的借鑒之路,首先作為一個(gè)開發(fā)者,我覺得學(xué)習(xí)的地方首選是B站,所以我找了相關(guān)的做智能小車的視頻 首先是B站智能小車教...
摘要:文章目錄一原理二實(shí)現(xiàn)顯示中文滾動(dòng)顯示顯示字符串讀取溫濕度顯示溫濕度三結(jié)果開機(jī)顯示歡迎信息循環(huán)讀取溫濕度以及滾動(dòng)顯示我的四總結(jié)五參考六源碼一原理的定義就是串行外圍設(shè)備接口。 ...
摘要:基于開發(fā)的軟件包導(dǎo)師汪禮超學(xué)員崔林威摘要騰訊物聯(lián)網(wǎng)操作系統(tǒng)是騰訊面向物聯(lián)網(wǎng)領(lǐng)域開發(fā)的實(shí)時(shí)操作系統(tǒng),具有低功耗,低資源占用,模塊化,可裁剪等特性。圖中斷函數(shù)處理進(jìn)行生成工程配置,按如下界面進(jìn)行配置,最后點(diǎn)擊,并點(diǎn)擊。 ...
閱讀 3526·2021-10-08 10:04
閱讀 870·2019-08-30 15:54
閱讀 2188·2019-08-29 16:09
閱讀 1353·2019-08-29 15:41
閱讀 2283·2019-08-29 11:01
閱讀 1743·2019-08-26 13:51
閱讀 1035·2019-08-26 13:25
閱讀 1833·2019-08-26 13:24