www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 21ic電子網(wǎng)
[導讀]有很多傳感器手冊給了我們時序圖,我們只要按照時序圖操作就行了,還有一些是標準接口,例如SPI,IIC,UART,這些可以利用硬件提供的收發(fā)器通信,還有一些我們沒有足夠的接口,或者沒有對應的接口與之通信,我們可以按照手冊提供的時序圖,利用IO來完成讀寫操作。完成的思路是模塊化編程思想,將問題逐個分解。由大化小,實現(xiàn)小的功能。

出品 ?21ic論壇? gaoyang9992006

網(wǎng)站:bbs.21ic.com


有很多傳感器手冊給了我們時序圖,我們只要按照時序圖操作就行了,還有一些是標準接口,例如SPI,IIC,UART,這些可以利用硬件提供的收發(fā)器通信,還有一些我們沒有足夠的接口,或者沒有對應的接口與之通信,我們可以按照手冊提供的時序圖,利用IO來完成讀寫操作。完成的思路是模塊化編程思想,將問題逐個分解。由大化小,實現(xiàn)小的功能。

比如常用的單線協(xié)議的溫濕度傳感器DHT21。

工程師為你講解,如何看懂時序圖!
可以看到一共40BIT,并注意到是以8BIT為單位的,因此我們可以先規(guī)劃成每次讀取8BIT,讀取5次,完成讀取。
工程師為你講解,如何看懂時序圖!

開始讀取時候,假設傳感器是空閑的,那么這個時候傳感器就是在高電平,主控想要發(fā)起讀取,要給傳感器一個讀取的信號,這個信號就是先拉低至少500us,然后拉高20到40us。
因此這個時候,主控的IO要處于輸出狀態(tài),我們可以輸出1,也可以輸出0,先輸出1,然后輸出0,將0持續(xù)的事件大于500us,然后輸出1
保持20us到40us。

為了靠譜,我這里拉低持續(xù)2ms,拉高持續(xù)30us,先設置IO的模式為輸出模式。
 Write_AM2301_PIN_Init();

拉低這個端口,即輸出0
 RESET_AM2301_PIN();


保持2ms,這樣就滿足最少500us了。
 HAL_Delay(2);

然后拉高它,輸出1
 SET_AM2301_PIN();

保持30us
 rt_hw_us_delay(30);

接下來傳感器就該響應這個請求了,這個時候就要讓主控讀取信號的模式了

讀取相應,因為接下來器件會主動拉低總線80us,然后再拉高80us.
我們先切換主控的這個IO到輸入模式,進行讀取。然后判斷
器件準備好的這個拉低拉高信號。

第一步,切斷刀輸入模式,準備讀取IO信號
 Read_AM2301_PIN_Init(); Sensor_AnswerFlag=0;

判斷是否傳感器拉低了總線,拉低表示傳感器要發(fā)送準備好信號了
 if(Read_AM2301_PIN()==GPIO_PIN_RESET) { Sensor_AnswerFlag=1; Sys_CNT=0;


等待準備好的拉低段80us結束,并計數(shù),看看是否超時。
 while(Read_AM2301_PIN()==GPIO_PIN_RESET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } Sys_CNT=0;

如果準備拉低狀態(tài)順利結束,再看看準備信號的拉高狀態(tài)是否OK
 while(Read_AM2301_PIN()==GPIO_PIN_SET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } }

一切OK的話,就該讀取實際的傳感器輸出值了。這個時候要寫入到存儲傳感器40BIT數(shù)值的變量里了
每次讀取8BIT,一共5此,所以用個循環(huán)。方到準備好的變量數(shù)組里
 for(i=0;i<5;i++) { AM2301_Data = Read_AM2301_Data();i> }</i>

接下來我們還要實現(xiàn)什么呢,當然是基本的讀取8BIT的操作了。

工程師為你講解,如何看懂時序圖!



根據(jù)這個時序圖,可以看出來什么是1,什么是0.
我們看到總線在傳輸數(shù)據(jù)時候,拉低都是50us,只有拉高長短不同,長的表示1,短的表示0.
因此我們讀取每一位時候,只要先判斷是不是低電平或者高電平,就行了。
在低電平時候我們等待,當高電平到來我們判斷是否大于28us,因為26us~28us表示0,70us標志1.
所以我們找一個介于28到70us之間的判斷閾值。
比如我以30us作為閾值,當?shù)碗娖浇Y束后,我延時30us,如果是0,這個時候高電平肯定結束了,
如果是1,高電平還在持續(xù)。
因此我通過這個思路判斷是0還是1.
因為我要讀取是8BIT,因此我用循環(huán)8次的操作。

unsigned char Read_AM2301_Data(void){ unsigned char i,cnt,buffer,tmp;//要讀取8次 for (i = 0; i < 8; i++) { cnt=0;//判斷低電平是否結束 while(!Read_AM2301_PIN()) { if(++cnt>=3000) break; }//低電平結束后,進入高電平,開始計時30us rt_hw_us_delay(30); tmp=0;//如果此時還是高電平,那么肯定是大于28us,確定是1來了,賦值1 if(Read_AM2301_PIN()) tmp=1; cnt=0;//等待高電平結束,號進入下一位的讀取 while(Read_AM2301_PIN()) { if(++cnt>=2000) break; }//移位寫入剛剛得到的1個BIT buffer<<=1; buffer|=tmp; } return buffer;}

接下來實現(xiàn)什么呢?
實現(xiàn)讀取IO狀態(tài)和寫高低電平。
unsigned char Read_AM2301_PIN(void){ return HAL_GPIO_ReadPin(AM2301_PORT, AM2301_PIN);}
void SET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_SET);}
void RESET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_RESET);}

這里我直接調用的HAL庫函數(shù),其實這么做是方便移植,如果你要去其他芯片下使用,你只需要實現(xiàn)這3個函數(shù)以及延時函數(shù)就行了。邏輯順序無需修改。最后奉上源碼
#include "stm32f0xx_hal.h"
//讀傳感器 端口位定義,可修改//*#define AM2301_PIN GPIO_PIN_10#define AM2301_PORT GPIOA#define AM2301_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()#define AM2301_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()

unsigned char Sensor_AnswerFlag; //收到起始標志位unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標志unsigned int Sys_CNT;unsigned char AM2301_Data[5]={0x00,0x00,0x00,0x00,0x00};
void Read_AM2301_PIN_Init(void){ AM2301_GPIO_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = AM2301_PIN; HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);}
void Write_AM2301_PIN_Init(void){ AM2301_GPIO_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = AM2301_PIN; HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);}
unsigned char Read_AM2301_PIN(void){ return HAL_GPIO_ReadPin(AM2301_PORT, AM2301_PIN);}
void SET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_SET);}
void RESET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_RESET);}
unsigned char Read_AM2301_Data(void){ unsigned char i,cnt,buffer,tmp; for (i = 0; i < 8; i++) { cnt=0; while(!Read_AM2301_PIN()) { if(++cnt>=3000) break; } rt_hw_us_delay(30); tmp=0; if(Read_AM2301_PIN()) tmp=1; cnt=0; while(Read_AM2301_PIN()) { if(++cnt>=2000) break; } buffer<<=1; buffer|=tmp; } return buffer;}
unsigned char Read_Sensor(void){ unsigned char i; Write_AM2301_PIN_Init(); RESET_AM2301_PIN();// rt_thread_mdelay(2); HAL_Delay(2); SET_AM2301_PIN(); rt_hw_us_delay(30); SET_AM2301_PIN();
Read_AM2301_PIN_Init(); Sensor_AnswerFlag=0; if(Read_AM2301_PIN()==GPIO_PIN_RESET) { Sensor_AnswerFlag=1; Sys_CNT=0; while(Read_AM2301_PIN()==GPIO_PIN_RESET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } Sys_CNT=0; while(Read_AM2301_PIN()==GPIO_PIN_SET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } for(i=0;i<5;i++) { AM2301_Data[i] = Read_AM2301_Data(); } } else { Sensor_AnswerFlag=0; } return 1;}



本文系21ic論壇網(wǎng)友gaoyang9992006原創(chuàng)



工程師為你講解,如何看懂時序圖!


免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

21ic電子網(wǎng)

掃描二維碼,關注更多精彩內容

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉