日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

出品 ?21ic論壇? gaoyang9992006

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


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

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

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

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

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

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


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

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

保持30us
 rt_hw_us_delay(30);

接下來傳感器就該響應(yīng)這個(gè)請求了,這個(gè)時(shí)候就要讓主控讀取信號(hào)的模式了

讀取相應(yīng),因?yàn)榻酉聛砥骷?huì)主動(dòng)拉低總線80us,然后再拉高80us.
我們先切換主控的這個(gè)IO到輸入模式,進(jìn)行讀取。然后判斷
器件準(zhǔn)備好的這個(gè)拉低拉高信號(hào)。

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

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


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

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

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

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

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



根據(jù)這個(gè)時(shí)序圖,可以看出來什么是1,什么是0.
我們看到總線在傳輸數(shù)據(jù)時(shí)候,拉低都是50us,只有拉高長短不同,長的表示1,短的表示0.
因此我們讀取每一位時(shí)候,只要先判斷是不是低電平或者高電平,就行了。
在低電平時(shí)候我們等待,當(dāng)高電平到來我們判斷是否大于28us,因?yàn)?6us~28us表示0,70us標(biāo)志1.
所以我們找一個(gè)介于28到70us之間的判斷閾值。
比如我以30us作為閾值,當(dāng)?shù)碗娖浇Y(jié)束后,我延時(shí)30us,如果是0,這個(gè)時(shí)候高電平肯定結(jié)束了,
如果是1,高電平還在持續(xù)。
因此我通過這個(gè)思路判斷是0還是1.
因?yàn)槲乙x取是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;//判斷低電平是否結(jié)束 while(!Read_AM2301_PIN()) { if(++cnt>=3000) break; }//低電平結(jié)束后,進(jìn)入高電平,開始計(jì)時(shí)30us rt_hw_us_delay(30); tmp=0;//如果此時(shí)還是高電平,那么肯定是大于28us,確定是1來了,賦值1 if(Read_AM2301_PIN()) tmp=1; cnt=0;//等待高電平結(jié)束,號(hào)進(jìn)入下一位的讀取 while(Read_AM2301_PIN()) { if(++cnt>=2000) break; }//移位寫入剛剛得到的1個(gè)BIT buffer<<=1; buffer|=tmp; } return buffer;}

接下來實(shí)現(xiàn)什么呢?
實(shí)現(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);}

這里我直接調(diào)用的HAL庫函數(shù),其實(shí)這么做是方便移植,如果你要去其他芯片下使用,你只需要實(shí)現(xiàn)這3個(gè)函數(shù)以及延時(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; //收到起始標(biāo)志位unsigned char Sensor_ErrorFlag; //讀取傳感器錯(cuò)誤標(biāo)志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)



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


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

21ic電子網(wǎng)

掃描二維碼,關(guān)注更多精彩內(nèi)容

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

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

關(guān)鍵字: 驅(qū)動(dòng)電源

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

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

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

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

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

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

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

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

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

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉