ఉష్ణోగ్రత సెన్సార్ టెక్నాలజీ

ఉష్ణోగ్రత సెన్సార్ ప్రోబ్ (DS18B20 మరియు PT100 యొక్క ఫంక్షనల్ సర్క్యూట్ డిజైన్)

DS18B20 స్కీమాటిక్ మరియు CUBEMAX కాన్ఫిగరేషన్

మధ్య పోలిక PT100 ఉష్ణోగ్రత సెన్సార్ ప్రోబ్ మరియు DS18B20 మాడ్యూల్
1) సిగ్నల్ సముపార్జన యొక్క ప్రాథమిక సూత్రం
① PT100 యొక్క ప్రతిఘటన ఉష్ణోగ్రతతో అనులోమానుపాతంలో మారుతుంది (అధిక ఉష్ణోగ్రత, ఎక్కువ ప్రతిఘటన), కానీ ప్రతిఘటన మార్పు చాలా చిన్నది, గురించి 0.385 ఓహ్ / డిగ్రీ;
② PT100 యొక్క ఉష్ణోగ్రత కొలత పరిధి -200℃ -200℃, మరియు 0℃ వద్ద, ప్రతిఘటన ఖచ్చితంగా సమానంగా ఉంటుంది 100 ఓహ్;
③ PT100 యొక్క పని కరెంట్ కంటే తక్కువగా ఉండాలి 5 mA;
④ PT100 యొక్క ప్రతిఘటన ఉష్ణోగ్రతతో అనులోమానుపాతంలో మారినప్పటికీ, దాని మార్పు రేటు (అంటే, K విలువ K విలువ K విలువ) వివిధ ఉష్ణోగ్రత పరిధులలో భిన్నంగా ఉంటుంది.

2) PT100 ఉష్ణోగ్రత నిరోధక మార్పు పట్టిక

PT100 ఉష్ణోగ్రత నిరోధక మార్పు పట్టిక

3. PT100 డ్రైవ్ సర్క్యూట్

PT100 డ్రైవ్ సర్క్యూట్

PT100 డ్రైవ్ సర్క్యూట్

1) వోల్టేజ్ డివిజన్ పద్ధతి ద్వారా, AD ఉష్ణోగ్రతను లెక్కించడానికి ప్రతిఘటన విలువను పొందేందుకు PT100 వోల్టేజ్‌ని సేకరిస్తుంది
గది ఉష్ణోగ్రత వద్ద నీటిలో PT100 యొక్క నిరోధక విలువ (25℃25℃25℃) గురించి ఉంది 109.89 ఓహ్.
మైక్రోకంట్రోలర్ 3.3V వోల్టేజీని అందిస్తుంది, మరియు PT100 ద్వారా విభజించబడిన వోల్టేజ్ సుమారుగా ఉంటుంది:
109.89 ∗ 0.005 = 0.54945 V

AD మార్పిడి సూత్రం ప్రకారం మార్చబడిన AD విలువ సుమారుగా ఉంటుంది:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

ఉష్ణోగ్రత ఒక డిగ్రీ పెరిగినప్పుడు, PT100 యొక్క ప్రతిఘటన కేవలం పెరుగుతుందని ఊహిస్తూ 0.385 ఓహ్, విభజించబడిన వోల్టేజ్ యొక్క మార్పు విలువ సుమారుగా సమానంగా ఉంటుంది:
0.385 ∗ 0.005 = 0.001925 V

AD మార్పిడి సూత్రం ప్రకారం మార్చబడిన AD విలువ సుమారుగా ఉంటుంది:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

ప్రయోగంలో, stm32 విద్యుత్ సరఫరా యొక్క అస్థిర 3.3V వోల్టేజ్ కారణంగా ఇది కనుగొనబడింది, ADC PT100 వోల్టేజ్ హెచ్చుతగ్గులను సేకరించింది మరియు వోల్టేజ్ విభజన లోపం పెద్దది. స్థిరమైన కరెంట్ సోర్స్ సర్క్యూట్‌ను రూపొందించడం ఆప్టిమైజేషన్ పరిష్కారం. PT100 యొక్క వోల్టేజ్ మరియు స్థిరమైన ప్రస్తుత మూలం యొక్క ప్రస్తుతాన్ని సేకరించడం ద్వారా, PT100 యొక్క ప్రతిఘటనను పొందవచ్చు, ఆపై ఉష్ణోగ్రత విలువను పొందవచ్చు.

2) LDO రెగ్యులేటర్ ఆధారంగా స్థిరమైన కరెంట్ సోర్స్ సర్క్యూట్ (MD5333)
ఇంటర్నెట్‌లో PT100ని పరీక్షించడానికి అనేక డ్రైవింగ్ సర్క్యూట్‌లు ఉన్నాయి, DC బ్రిడ్జ్ సర్క్యూట్ వంటివి, ఆపరేషనల్ యాంప్లిఫైయర్ ఆధారంగా స్థిరమైన ప్రస్తుత మూలం సర్క్యూట్, మొదలైనవి. డ్రైవింగ్ సర్క్యూట్‌ను ఎంచుకోవడంలో రచయిత చాలా సమయం గడిపారు, బోర్డు మరియు భాగాల సంఖ్యను తయారు చేయడంలో ఇబ్బందిని పరిగణనలోకి తీసుకుంటుంది, మరియు చివరకు LDO రెగ్యులేటర్ ఆధారంగా స్థిరమైన కరెంట్ సోర్స్ సర్క్యూట్‌ను ఎంచుకున్నారు (MD5333). సర్క్యూట్ రేఖాచిత్రం క్రింది విధంగా ఉంది:

LDO రెగ్యులేటర్ యొక్క స్థిరమైన కరెంట్ సోర్స్ సర్క్యూట్ (MD5333)

LDO రెగ్యులేటర్ యొక్క స్థిరమైన కరెంట్ సోర్స్ సర్క్యూట్ (MD5333)

ఈ సమయంలో, హార్డ్‌వేర్ ఎంపిక ప్రాథమికంగా పూర్తయింది. ఉపయోగించిన డెవలప్‌మెంట్ బోర్డ్ Zhengdian Atom F10ZET6 ఎలైట్ బోర్డ్

DS18B20 మాడ్యూల్
నిజ-సమయ ఉష్ణోగ్రత మరియు PT100 ఉష్ణోగ్రత పోలికను పరీక్షించడానికి, క్రమాంకనం పోలిక పరీక్ష కోసం DS18B20 మాడ్యూల్ జోడించబడింది

1) DS18B20కి పరిచయం
DS18B20 అనేది పరీక్ష ఉష్ణోగ్రత పరిధి -55~+125℃ మరియు ±0.5℃ ఖచ్చితత్వంతో ఒకే-బస్సు ఉష్ణోగ్రత సెన్సార్.. క్షేత్ర ఉష్ణోగ్రత నేరుగా ఒకే బస్సు డిజిటల్ పద్ధతిలో ప్రసారం చేయబడుతుంది, ఇది సిస్టమ్ యొక్క వ్యతిరేక జోక్య సామర్థ్యాన్ని బాగా మెరుగుపరుస్తుంది. ఇది కొలిచిన ఉష్ణోగ్రతను నేరుగా చదవగలదు, మరియు వాస్తవ అవసరాలకు అనుగుణంగా సాధారణ ప్రోగ్రామింగ్ ద్వారా 9~12-బిట్ డిజిటల్ విలువ పఠన పద్ధతిని గ్రహించవచ్చు. దీని ఆపరేటింగ్ వోల్టేజ్ పరిధి 3~5.5V, మరియు ఇది వివిధ రకాల ప్యాకేజింగ్ రూపాలను ఉపయోగిస్తుంది, సిస్టమ్ సెట్టింగ్‌ను అనువైనదిగా మరియు సౌకర్యవంతంగా చేస్తుంది. సెట్ రిజల్యూషన్ మరియు వినియోగదారు సెట్ చేసిన అలారం ఉష్ణోగ్రత EEPROMలో నిల్వ చేయబడతాయి మరియు విద్యుత్ వైఫల్యం తర్వాత ఇప్పటికీ సేవ్ చేయబడతాయి.

DS18B20 సర్క్యూట్ డిజైన్

DS18B20 సర్క్యూట్ డిజైన్

2) DS18B20 పని సమయానికి పరిచయం
డేటా సమగ్రతను నిర్ధారించడానికి అన్ని సింగిల్-బస్ పరికరాలకు ఖచ్చితమైన సిగ్నల్ టైమింగ్ అవసరం. DS18B20 ఉంది 6 సిగ్నల్ రకాలు: పల్స్ రీసెట్ చేయండి, ప్రతిస్పందన పల్స్, వ్రాయండి 0, వ్రాయండి 1, చదివాడు 0 మరియు చదవండి 1. ఈ సంకేతాలన్నీ, ప్రతిస్పందన పల్స్ తప్ప, హోస్ట్ పంపిన సింక్రోనస్ సిగ్నల్స్. మరియు అన్ని ఆదేశాలు మరియు డేటా ముందుగా బైట్ యొక్క తక్కువ బిట్‌తో పంపబడతాయి.

DS18B20 రీసెట్ పల్స్ మరియు ప్రతిస్పందన పల్స్

DS18B20 రీసెట్ పల్స్ మరియు ప్రతిస్పందన పల్స్

① పల్స్ మరియు ప్రతిస్పందన పల్స్ రీసెట్ చేయండి
ఒకే బస్సులో అన్ని కమ్యూనికేషన్‌లు ప్రారంభ క్రమంతో ప్రారంభమవుతాయి. హోస్ట్ తక్కువ స్థాయిని అవుట్‌పుట్ చేస్తుంది మరియు రీసెట్ పల్స్‌ను రూపొందించడానికి కనీసం 480us వరకు తక్కువ స్థాయిని ఉంచుతుంది. అప్పుడు హోస్ట్ బస్సును విడుదల చేస్తుంది, మరియు 4.7K పుల్-అప్ రెసిస్టర్ సింగిల్ బస్‌ను ఎత్తుకు లాగుతుంది, 15~60us ఆలస్యం సమయంతో, మరియు స్వీకరించే మోడ్‌లోకి ప్రవేశిస్తుంది (Rx). అప్పుడు DS18B20 తక్కువ-స్థాయి ప్రతిస్పందన పల్స్‌ను రూపొందించడానికి 60~240us వరకు బస్సును తక్కువగా లాగుతుంది.

DS18B20 వ్రాసే సమయం

DS18B20 వ్రాసే సమయం

② టైమింగ్ వ్రాయండి
వ్రాసే సమయం వ్రాయడాన్ని కలిగి ఉంటుంది 0 సమయం మరియు వ్రాయండి 1 సమయపాలన. అన్ని వ్రాసే సమయాలకు కనీసం 60US అవసరం, మరియు రెండు స్వతంత్ర వ్రాత సమయాల మధ్య కనీసం 1us రికవరీ సమయం అవసరం. రెండు వ్రాసే సమయాలు హోస్ట్ బస్సుని క్రిందికి లాగడంతో ప్రారంభమవుతాయి. వ్రాయండి 1 సమయపాలన: హోస్ట్ తక్కువ స్థాయిని అవుట్‌పుట్ చేస్తుంది, 2us కోసం ఆలస్యం, ఆపై బస్సును విడుదల చేస్తాడు, 60us ఆలస్యం. వ్రాయండి 0 సమయపాలన: హోస్ట్ తక్కువ స్థాయిని అవుట్‌పుట్ చేస్తుంది, 60us ఆలస్యం అవుతుంది, ఆపై 2us ఆలస్యంతో బస్సును విడుదల చేస్తుంది.

DS18B20 రీడ్ టైమింగ్

DS18B20 రీడ్ టైమింగ్

③ చదివే సమయం
హోస్ట్ రీడ్ టైమింగ్‌ని జారీ చేసినప్పుడు మాత్రమే సింగిల్-బస్ పరికరాలు హోస్ట్‌కి డేటాను ప్రసారం చేస్తాయి. అందువల్ల, హోస్ట్ రీడ్ డేటా ఆదేశాన్ని జారీ చేసిన తర్వాత, స్లేవ్ డేటాను ట్రాన్స్‌మిట్ చేయడానికి వెంటనే రీడ్ టైమింగ్ రూపొందించాలి. అన్ని రీడ్ టైమింగ్‌లకు కనీసం 60US అవసరం, మరియు రెండు స్వతంత్ర రీడ్ టైమింగ్‌ల మధ్య కనీసం 1us రికవరీ సమయం అవసరం. ప్రతి రీడ్ టైమింగ్ హోస్ట్ ద్వారా ప్రారంభించబడుతుంది, ఇది కనీసం 1US బస్సును క్రిందికి లాగుతుంది. రీడ్ టైమింగ్ సమయంలో హోస్ట్ బస్సును విడుదల చేయాలి మరియు టైమింగ్ ప్రారంభమైన తర్వాత 15us లోపు బస్సు స్థితిని నమూనా చేయాలి. సాధారణ రీడ్ టైమింగ్ ప్రక్రియ: హోస్ట్ 2us తక్కువ స్థాయి ఆలస్యాన్ని అందిస్తుంది, ఆపై హోస్ట్ 12us యొక్క ఇన్‌పుట్ మోడ్ ఆలస్యంకి మారుతుంది, అప్పుడు ఒకే బస్సు ప్రస్తుత స్థాయిని చదువుతుంది, ఆపై 50us ఆలస్యం అవుతుంది.

DS18B20 ఉష్ణోగ్రత సమాచారాన్ని ముద్రించడానికి సీరియల్ పోర్ట్‌ను తెరుస్తుంది

DS18B20 ఉష్ణోగ్రత సమాచారాన్ని ముద్రించడానికి సీరియల్ పోర్ట్‌ను తెరుస్తుంది

సింగిల్ బస్ టైమింగ్ అర్థం చేసుకున్నాక, DS18B20 యొక్క సాధారణ ఉష్ణోగ్రత పఠన ప్రక్రియను పరిశీలిద్దాం. DS18B20 యొక్క సాధారణ ఉష్ణోగ్రత పఠన ప్రక్రియ: రీసెట్ → SKIPROMని పంపండి (0xCC) → ప్రారంభ మార్పిడి ఆదేశాన్ని పంపండి (0x44) → ఆలస్యం → రీసెట్ → SKIPROM ఆదేశాన్ని పంపండి (0xCC) → మెమరీ కమాండ్ పంపండి (0xBE) → రెండు బైట్‌ల డేటాను చదవండి (అనగా. ఉష్ణోగ్రత) నిరంతరం → ముగింపు.

3) స్కీమాటిక్ రేఖాచిత్రం మరియు CUBEMAX కాన్ఫిగరేషన్
స్కీమాటిక్ రేఖాచిత్రం నుండి, ఉష్ణోగ్రత సమాచారాన్ని ప్రింట్ చేయడానికి సీరియల్ పోర్ట్‌ను తెరవడానికి PG11 పోర్ట్ ద్వారా DS18B20 ప్రారంభించబడిందని చూడవచ్చు.

DS18B20 స్కీమాటిక్ మరియు CUBEMAX కాన్ఫిగరేషన్

DS18B20 స్కీమాటిక్ మరియు CUBEMAX కాన్ఫిగరేషన్

DS18B20 ఉష్ణోగ్రత మరియు తేమ సెన్సార్ ఇంటర్‌ఫేస్

DS18B20 ఉష్ణోగ్రత మరియు తేమ సెన్సార్ ఇంటర్‌ఫేస్

4) కోడ్ భాగం
కోడ్ భాగం Zhengdian Atom యొక్క ds18b20 లైబ్రరీని మార్పిడి చేస్తుంది మరియు స్వల్ప మార్పులను చేస్తుంది

#ifndef __DS18B20_H
#__DS18B20_H నిర్వచించండి

#చేర్చండి “tim.h”
/***********************************************************************************/
/* DS18B20 పిన్ నిర్వచనం */

#DS18B20_DQ_GPIO_PORT GPIOGని నిర్వచించండి
#DS18B20_DQ_GPIO_PIN GPIO_PIN_11ని నిర్వచించండి
#DS18B20_DQ_GPIO_CLK_ENABLEని నిర్వచించండి() చేయండి{ __HAL_RCC_GPIOG_CLK_ENABLE(); }అయితే(0) /* PG పోర్ట్ క్లాక్ ఎనేబుల్ */

/**********************************************************************************************/

/* IO ఆపరేషన్ ఫంక్షన్ */
#DS18B20_DQ_OUTని నిర్వచించండి(x) చేయండి{ x ? \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET); \
}అయితే(0) /* డేటా పోర్ట్ అవుట్‌పుట్ */
#DS18B20_DQ_IN HAL_GPIO_ReadPinని నిర్వచించండి(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* డేటా పోర్ట్ ఇన్‌పుట్ */

uint8_t ds18b20_init(శూన్యం); /* DS18B20ని ప్రారంభించండి */
uint8_t ds18b20_check(శూన్యం); /* DS18B20 ఉందో లేదో తనిఖీ చేయండి */
చిన్న ds18b20_get_temperature(శూన్యం);/* ఉష్ణోగ్రత పొందండి */

#endif

5. ఇన్ఫ్రారెడ్ రిమోట్ కంట్రోల్ మాడ్యూల్
1) వైర్‌లెస్ మాడ్యూల్ కోడింగ్ ప్రోటోకాల్

పరారుణ రిమోట్ కంట్రోల్ కోసం విస్తృతంగా ఉపయోగించే కోడింగ్ పద్ధతులు: PWM యొక్క NEC ప్రోటోకాల్ (పల్స్ వెడల్పు మాడ్యులేషన్) మరియు ఫిలిప్స్ PPM యొక్క RC-5 ప్రోటోకాల్ (పల్స్ స్థానం మాడ్యులేషన్). డెవలప్‌మెంట్ బోర్డ్‌తో వచ్చే రిమోట్ కంట్రోల్ NEC ప్రోటోకాల్‌ను ఉపయోగిస్తుంది, కింది లక్షణాలను కలిగి ఉంది:

1. 8-బిట్ చిరునామా మరియు 8-బిట్ సూచనల పొడవు;

2. చిరునామా మరియు ఆదేశం రెండుసార్లు ప్రసారం చేయబడతాయి (విశ్వసనీయతను నిర్ధారించడానికి);

3. PWM పల్స్ స్థానం మాడ్యులేషన్, ట్రాన్స్మిటెడ్ ఇన్ఫ్రారెడ్ క్యారియర్ యొక్క విధి చక్రంతో ప్రాతినిధ్యం వహిస్తుంది “0” మరియు “1”;

4. క్యారియర్ ఫ్రీక్వెన్సీ 38Khz;

5. బిట్ సమయం 1.125ms లేదా 2.25ms;

NEC ప్రోటోకాల్‌లో, ప్రోటోకాల్‌లోని డేటాను ఎలా సెట్ చేయాలి ‘0’ లేదా '1'? ఇక్కడ, ఇన్‌ఫ్రారెడ్ రిసీవర్ మరియు ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్ వేరు చేయబడ్డాయి.

ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్: క్యారియర్ సిగ్నల్ ట్రాన్స్‌మిషన్ యొక్క ప్రోటోకాల్ డేటా ‘0’ = 560us పంపండి + 560మాకు క్యారియర్ సిగ్నల్ ట్రాన్స్మిషన్ లేదు

క్యారియర్ సిగ్నల్ ట్రాన్స్‌మిషన్ యొక్క ప్రోటోకాల్ డేటా ‘1’ = 560us పంపండి + 1680మాకు క్యారియర్ సిగ్నల్ ట్రాన్స్మిషన్ లేదు

ఇన్ఫ్రారెడ్ ట్రాన్స్మిటర్ యొక్క బిట్ నిర్వచనం క్రింది చిత్రంలో చూపబడింది

ఇన్ఫ్రారెడ్ రిసీవర్: ప్రోటోకాల్ డేటా '0' = 560us తక్కువ స్థాయిని స్వీకరించండి + 560మాకు ఉన్నత స్థాయి

ప్రోటోకాల్ డేటా ‘1’ = 560us తక్కువ స్థాయిని స్వీకరించండి + 1680మాకు ఉన్నత స్థాయి

NEC రిమోట్ కంట్రోల్ కమాండ్ యొక్క డేటా ఫార్మాట్: సమకాలీకరణ టెర్మినల్, చిరునామా కోడ్, చిరునామా విలోమ కోడ్, నియంత్రణ కోడ్, నియంత్రణ విలోమ కోడ్. సమకాలీకరణ కోడ్ 9ms తక్కువ స్థాయి మరియు 4.5ms అధిక స్థాయిని కలిగి ఉంటుంది. చిరునామా కోడ్, చిరునామా విలోమ కోడ్, నియంత్రణ కోడ్, మరియు నియంత్రణ విలోమ కోడ్ అన్నీ 8-బిట్ డేటా ఫార్మాట్‌లు. అవి తక్కువ బిట్ ఫస్ట్ మరియు హై బిట్ లాస్ట్ అనే క్రమంలో పంపబడతాయి. ట్రాన్స్మిషన్ యొక్క విశ్వసనీయతను పెంచడానికి విలోమ కోడ్ ఉపయోగించబడుతుంది.

అందువల్ల, ఇన్‌పుట్ క్యాప్చర్ రిమోట్ కంట్రోల్ డీకోడింగ్ సాధించడానికి అధిక స్థాయి పల్స్ వెడల్పును కొలవడానికి ఉపయోగించవచ్చు.
2) స్కీమాటిక్ రేఖాచిత్రం మరియు CUBEMAX కాన్ఫిగరేషన్

స్కీమాటిక్ రేఖాచిత్రం నుండి, వైర్‌లెస్ మాడ్యూల్ PB9 పిన్ ద్వారా ప్రారంభించబడిందని మరియు దీని ద్వారా సేకరిస్తున్నట్లు మనం చూడవచ్చు 4 TIM4 యొక్క ఛానెల్‌లు:

TIM4_CH4 యొక్క డిఫాల్ట్ పిన్ PB9 కాదు, కనుక ఇది మానవీయంగా సెట్ చేయాలి, మరియు అంతరాయ సెట్టింగ్ అదే సమయంలో ఆన్ చేయబడింది

3) కోడ్ భాగం
టిమ్ కాల్‌బ్యాక్ ఫంక్షన్ ద్వారా పెరుగుతున్న అంచుని క్యాప్చర్ చేయండి

ఈ సమయంలో, డీకోడ్ చేయబడిన సిగ్నల్ పొందవచ్చు:

ఈ సమయంలో, డేటా మరింత క్లిష్టంగా ఉంటుంది మరియు కొద్దిగా ప్రాసెస్ చేయవచ్చు:

ప్రభావం క్రింది విధంగా ఉంది:
చివరి రెండు అంకెలు డీకోడ్ మరియు దాని విలోమ కోడ్. ఈ సమయంలో, ఉష్ణోగ్రత థ్రెషోల్డ్‌ని సర్దుబాటు చేయడానికి దీనిని స్థూలంగా నిర్వచించవచ్చు:

ప్రభావం క్రింది విధంగా ఉంది:

ఇన్ఫ్రారెడ్ పార్ట్ కోడ్:

/* వినియోగదారు కోడ్ ప్రారంభ శీర్షిక */
/**
******************************************************************************
* @ఫైల్ : ప్రధాన.సి
* @సంక్షిప్తంగా : ప్రధాన ప్రోగ్రామ్ బాడీ
******************************************************************************
* @శ్రద్ధ
*
* <h2><కేంద్రం>&కాపీ; కాపీరైట్ (సి) 2024 STMమైక్రోఎలక్ట్రానిక్స్.
* అన్ని హక్కులు ప్రత్యేకించబడ్డాయి.</కేంద్రం></h2>
*
* ఈ సాఫ్ట్‌వేర్ భాగం BSD 3-క్లాజ్ లైసెన్స్ క్రింద ST ద్వారా లైసెన్స్ చేయబడింది,
* ది “లైసెన్స్”; మీరు ఈ ఫైల్‌ను పాటించకుండా ఉపయోగించలేరు
* లైసెన్స్. మీరు లైసెన్స్ కాపీని ఇక్కడ పొందవచ్చు:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* వినియోగదారు కోడ్ ముగింపు శీర్షిక */
/* కలిపి ——————————————————————*/
#చేర్చండి “main.h”
#చేర్చండి “tim.h”
#చేర్చండి “usart.h”
#చేర్చండి “gpio.h”

/* ప్రైవేట్ కలిగి ఉంటుంది ———————————————————-*/
/* USER CODE BEGIN కలిగి ఉంటుంది */
#చేర్చండి “stdio.h”
#చేర్చండి “string.h”
#MAXUPని నిర్వచించండి 157
#MAXDOWNని నిర్వచించండి 87
#MINUPని నిర్వచించండి 221
#MINDOWNని నిర్వచించండి 61
/* వినియోగదారు కోడ్ ముగింపును కలిగి ఉంటుంది */

/* ప్రైవేట్ టైప్‌డెఫ్ ———————————————————–*/
/* వినియోగదారు కోడ్ ప్రారంభం PTD */

/* వినియోగదారు కోడ్ ముగింపు PTD */

/* ప్రైవేట్ నిర్వచించండి ————————————————————*/
/* వినియోగదారు కోడ్ ప్రారంభం PD */
/* వినియోగదారు కోడ్ ముగింపు PD */

/* ప్రైవేట్ మాక్రో ————————————————————-*/
/* USER కోడ్ ప్రారంభం PM */

/* వినియోగదారు కోడ్ ముగింపు PM */

/* ప్రైవేట్ వేరియబుల్స్ ———————————————————*/

/* వినియోగదారు కోడ్ ప్రారంభం PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t వెడల్పు=0;
uint16_t బఫర్[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* వినియోగదారు కోడ్ ముగింపు PV */

/* ప్రైవేట్ ఫంక్షన్ ప్రోటోటైప్‌లు ———————————————–*/
సిస్టమ్‌క్లాక్_కాన్ఫిగ్ శూన్యం(శూన్యం);
/* యూజర్ కోడ్ ప్రారంభం PFP */

/* వినియోగదారు కోడ్ ముగింపు PFP */

/* ప్రైవేట్ యూజర్ కోడ్ ———————————————————*/
/* వినియోగదారు కోడ్ ప్రారంభం 0 */
శూన్యం HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
HAL_TIM_IC_CaptureCallback శూన్యం(TIM_HandleTypeDef *htim)
{
ఉంటే(isUpCapt)//ఇది ఎడ్జ్ క్యాప్చర్ పెరుగుతున్నట్లయితే
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
వేరే{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
వెడల్పు=ValueDown+upCount*65536-ValueUp;
ఉంటే(వెడల్పు>4400&&వెడల్పు<4600)
{
bufferId=0;
బఫర్[bufferId++]= వెడల్పు;
}
లేకపోతే(bufferId>0)
{
బఫర్[bufferId++]= వెడల్పు;
ఉంటే(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
శూన్యం bitBuffer2num(చార్ నం[])
{
సంఖ్య[0]=0;
సంఖ్య[1]=0;
సంఖ్య[2]=0;
సంఖ్య[3]=0;
కోసం(int i=0;i<32;i++)
{
ఉంటే(బఫర్[i+1]<1000)
{
సంఖ్య[i/8]= సంఖ్య[i/8]<<1;
}
వేరే
{
సంఖ్య[i/8]= సంఖ్య[i/8]<<1;
సంఖ్య[i/8]|=0x01;
}
}
}
/* వినియోగదారు కోడ్ ముగింపు 0 */

/**
* @బ్రీఫ్ అప్లికేషన్ ఎంట్రీ పాయింట్.
* @retval int
*/
పూర్ణాంక ప్రధాన(శూన్యం)
{
/* వినియోగదారు కోడ్ ప్రారంభం 1 */
చార్ ప్రింట్‌బఫ్[128]={0};
చార్ నం[4]={0};
చార్ కీ = 0;
/* వినియోగదారు కోడ్ ముగింపు 1 */

/* MCU కాన్ఫిగరేషన్——————————————————–*/

/* అన్ని పెరిఫెరల్స్ రీసెట్, ఫ్లాష్ ఇంటర్‌ఫేస్ మరియు సిస్టిక్‌ను ప్రారంభిస్తుంది. */
HAL_Init();

/* USER CODE ప్రారంభం Init */

/* వినియోగదారు కోడ్ ముగింపు Init */

/* సిస్టమ్ గడియారాన్ని కాన్ఫిగర్ చేయండి */
SystemClock_Config();

/* యూజర్ కోడ్ SysInit ప్రారంభం */

/* వినియోగదారు కోడ్ ముగింపు SysInit */

/* కాన్ఫిగర్ చేయబడిన అన్ని పెరిఫెరల్స్‌ను ప్రారంభించండి */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* వినియోగదారు కోడ్ ప్రారంభం 2 */

/* వినియోగదారు కోడ్ ముగింపు 2 */

/* అనంతమైన లూప్ */
/* వినియోగదారు కోడ్ ఈ సమయంలో ప్రారంభమవుతుంది */
HAL_GPIO_TogglePin(LED0_GPIO_పోర్ట్,LED0_పిన్);
HAL_TIM_Base_Start_IT(&htim4);//టైమర్ అప్‌డేట్ అంతరాయాన్ని సృష్టిస్తుంది
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
అయితే (1)
{
ఉంటే(rcvFalg)
{
కోసం(int i=0;i<4;i++)
{
bitBuffer2num(సంఖ్య);
స్ప్రింట్ఎఫ్(ప్రింట్ బఫ్,”0xx “,సంఖ్య[i]);
HAL_UART_ట్రాన్స్మిట్(&huart1, ప్రింట్‌బఫ్,స్ట్రెన్(ప్రింట్ బఫ్),HAL_MAX_DELAY);
}
// స్ప్రింట్ఎఫ్(ప్రింట్ బఫ్,”%u “,బఫర్[i]);
// HAL_UART_ట్రాన్స్మిట్(&huart1, ప్రింట్‌బఫ్,స్ట్రెన్(ప్రింట్ బఫ్),HAL_MAX_DELAY);
// }
HAL_UART_ట్రాన్స్మిట్(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,సంఖ్య[3]);
ఉంటే(సంఖ్య[3]==157)
{
printf(“111111\r\n”);
}
HAL_ఆలస్యం(1000);
/* వినియోగదారు కోడ్ ముగింపు అయితే */

/* వినియోగదారు కోడ్ ప్రారంభం 3 */
}
/* వినియోగదారు కోడ్ ముగింపు 3 */
}

/**
* @బ్రీఫ్ సిస్టమ్ క్లాక్ కాన్ఫిగరేషన్
* @retval ఏదీ లేదు
*/
సిస్టమ్‌క్లాక్_కాన్ఫిగ్ శూన్యం(శూన్యం)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};