|
1. Połączenie górnego i dolnego poziomu W bezprzewodowych sieciach czujników ważne jest przekształcanie wartości analogowych czujników na wielkości cyfrowe, co ułatwia transmisję i przetwarzanie. Do zakończenia tej konwersji stosuje się ADC (konwerter analogowo-cyfrowy). W poprzedniej części wprowadziliśmy komunikację portową szeregową między CC2430 a komputerem PC. CC2430 ma wbudowany czujnik temperatury, a ta sekcja przeprowadzi prosty eksperyment dotyczący monitorowania temperatury na chipie oparty na poprzedniej sekcji: użyj ADC do przekształcenia wartości napięcia czujnika temperatury na chip na cyfrową, użyj wzoru do obliczenia wartości temperatury, a następnie przekaż tę wartość do komputera komputera przez port szeregowy i wyświetl ją. 2. Pojedyncze próbkowanie ADC(1) Wprowadzenie do eksperymentuADC służy do konwersji wartości temperatury czujnika temperatury CC2430 na chipie, a wartość temperatury jest przesyłana do komputera przez port szeregowy i wyświetlana. (2) Schemat przepływu programu
(3) Kod źródłowy eksperymentalny i analiza/*
Opis eksperymentalny: Eksperyment akwizycji temperatury w chipie przesyła dane do komputera przez port szeregowy 0
*/
#include
#define prowadził1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define LED4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
pustkaxtal_init(pustka)
{ SEN &= ~0x04; //都上电
podczas gdy(! (SEN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Wybierz oscylator kryształowy 32MHz SEN |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
pustkaled_init(pustka)
{ P1SEL =0x00; P1 to zwykły port I/O P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 wyjście
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
pustka Uart0Init(Niepodpisany charStopBits,Niepodpisany charParytet)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; ustaw tryb UART i włącz akceptor U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Równość; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
pustka Uart0Send(Niepodpisany chardane)
{
podczas gdy(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = dane;
}
/*UART0发送字符串
-------------------------------------------------------*/
pustkaUart0SendString(Niepodpisany char*s)
{
podczas gdy(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
Niepodpisany charUart0Receive(pustka)
{
Niepodpisany chardane;
podczas gdy(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
powrótdane;
}
/*延时函数
-------------------------------------------------------*/
pustkaOpóźnienie(Niepodpisany intn)
{
Niepodpisany inti;
dla(i=0; i<n; i++);
dla(i=0; i<n; i++);
dla(i=0; i<n; i++);
dla(i=0; i<n; i++);
dla(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
PływaniegetTemperature(pustka)
{
Niepodpisany int wartości;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Inicjuj konwersje AD
podczas gdy(! (ADCCON1 &0x80)); //等待ADC转化结束
wartość = ADCL >>2; wartość |= (ADCH <<6); //取得最终转化结果,存入value中
powrótWartość*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
pustkamain(pustka)
{
chari;
PływanieavgTemp;
Niepodpisany charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Witaj CC2430 - Czujnik Temperatury!");
podczas gdy(1) { led1 =0; avgTemp =0;
dla(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Wyjście[0] = (Niepodpisany char(avgTemp)/10 + 48; //十位 Wyjście[1] = (Niepodpisany char)(avgTemp)%10 + 48; //个位 Wyjście[2] ='.'; //小数点 Wyjście[3] = (Niepodpisany char)(avgTemp*10)%10+48; //十分位 Wyjście[4] = (Niepodpisany char)(avgTemp*100)%10+48; //百分位 wyjście[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); Opóźnienie(20000); }
}
Aby uzyskać treść kodu komunikacji portowej szeregowej, prosimy odwołać się do poprzedniej sekcji, która tutaj nie będzie wyjaśniona~ ADC zazwyczaj obejmują 6 SFR: | ADCCON1 | Dla ogólnej kontroli ADC, w tym flagi end konwersji, metody wyzwalania ADC, generatora liczb losowych | | ADCCON2 | Konfiguracja do ciągłej konwersji ADC (eksperyment ten nie obejmuje ciągłej konwersji ADC i dlatego nie używa tej SFR) | | ADCCON3 | Konfiguracja dla pojedynczej konwersji ADC, w tym wybór napięcia referencyjnego, rozdzielczości, źródła konwersji | | ADCH[7:0] | Wysoki poziom konwersji ADC, czyli ADC [13:6] | | ADCL[7:2] | Niski poziom konwersji ADC, czyli ADC [5:0] | | ADCCFG | AIN0~AIN7 z P0.0~P0.7 jako wejściem ADC (ten SFR nie jest używany, ponieważ w tym teście jako źródło konwersji wybiera się czujnik temperatury na chipie i nie obejmuje AIN0~AIN7) |
(Uwaga: Prosimy zaliczyć się do chińskiego podręcznika CC2430, aby poznać powyższe szczegóły dotyczące SFR) Teraz skupmy się na tymgetTempuraturefunkcja, która jest kluczem do uzyskania wartości temperatury: (1) Najpierw skonfigurować ADC do pojedynczej próbki: ustaw ADCCON3=0x3E, wybierz 1,25V jako napięcie systemowe, wybierz rozdzielczość 14-bitową i wybierz czujnik temperatury CC2430 na chipie jako źródło konwersji ADC (2) Następnie ustaw ADCCON1 |= 0x30, aby ustawić metodę wyzwalania ADC na ręczną (czyli gdy ADCCON.6=1 rozpocznie przejście ADC) (3) Następnie niech ADCCON1 |= 0x40 rozpocznie pojedynczą konwersję ADC (4) Użyj instrukcji while(!( ADCCON1 &0x80)) Czekać na koniec przejścia ADC (5) Wynik konwersji jest przechowywany w ADCH[7:0] (8 bitów wysoki), ADCH [7:2] (6 bitów niżej) i przekazywany: wartość = ADCL >>2; wartość |= (ADCH <<6);
Zapisz wynik konwersji w wartości (6) Na koniec użyj wzorutemperatura = wartość*0,06229-311,43, oblicza wartość temperatury i zwraca Porady CC2430Musisz być zaskoczony ostatnim wzorem, dlaczego jednorazowa funkcja? Dlaczego ma nachylenie 0,06229 i przecięcie 211,43? OK, oto odpowiedź: Ten czujnik temperatury znajduje się wewnątrz układu CC2430, więc jego opis można znaleźć w instrukcji instrukcji. I rzeczywiście, jestem tutajSpecyfikacje elektryczneOdpowiednie treści znajdują się w tej sekcji, a zrzut ekranu przedstawia się następująco:
Ta tabela opisuje temperaturę (°C) czujnika temperatury w stosunku do napięcia wyjściowego (V). Najpierw spójrz na drugie czerwone ramki:Współczynnik temperatury。 "Współczynnik"? Czy to nie jest trochę nieprzyjemne? Potem spójrz na jego jednostkę: mV/°C, a nagle zorientujesz się, że zależność między temperaturą a napięciem jest liniowa~ To znaczy: gdzie V to wartość napięcia wyjściowego, T to wartość temperatury, a 2,45 to nachylenie. Przecięcie b musi być określone poniżej. Na pierwszy rzut oka zobaczymy, że przy pierwszym czerwonym pudełku napięcie w 0°C wynosi 743mV, więc b równa się 743? W przeciwnym razie, jeśli będziesz dalej patrzeć w dół, zobaczysz, że jego błąd absolutny sięga nawet 8°C! Patrząc w prawo, zobaczymy, że już dostarcza najbardziej odpowiedniego przecięcia, tzn.: b=763, więc istnieje następujący wzór: OK, teraz już mamy czujnik temperaturyWprowadź temperaturę TiNapięcie wyjściowe VNastępnym krokiem jest znalezienie ADCNapięcie wejściowe ViWartość wyjściowa N(czyli wynik konwersji 14 bitów), a na końcu znajdujemy wzór konwersji N i T. Wynik konwersji N wynosi 14 bitów, a gdy N=11 1111 1111 1111 1111 (binarne), napięcie wyjściowe powinno być maksymalną wartością (czyli napięcie odniesienia 1,25V). W związku z tym mamy następującą relację proporcjonalną:
(Uwaga: Ponieważ wyjście 14 bitów jest dopełnieniem binarnym, 14. bit jest bitem symbolu.) W ujęciu bezwzględnym efektywna wartość wynosi tylko 13 bitów, więc jest 2 do potęgi 13) Łącząc oba wzory, można wyprowadzić relację między T a N: KONIEC~
Na koniec kilka słów o tym, dlaczego wymagane jest 64 cykle na próbkę. Ponieważ czujniki nieuchronnie narażają się na zakłócenia lub losowe błędy podczas pomiaru temperatury, dane uzyskane przez czujniki są czasem wyolbrzymiane (na przykład nagła zmiana o 10°C, a następnie natychmiastowy powrót do normy). Ale wiemy, że zmiana temperatury jest procesem integralnym i rzadko zdarza się, by duży skok zachodził w mgnieniu oka). Dlatego stosujemy metodę uśredniania, aby zmniejszyć takie błędy. (4) Wyniki eksperymentalneNajpierw otwórz narzędzie do debugowania portów szeregowych, potem pobierz program i uruchom go, a pojawi się następujący ekran:
Temperatura wewnątrz folii wynosi około 14,5°C. Autor odczuwa temperaturę pokoju w akademiku swoim ciałem, która wynosi nieco ponad 10°C. Wnętrze chipa musi się nagrzewać, więc 14°C to praktycznie norma~ To koniec eksperymentu. 3. PodsumowanieTen artykuł opisuje implementację pojedynczego próbkowania ADC. W następnej sekcji przedstawimy tryb transferu danychDMA(bezpośredni dostęp do pamięci), czyli "bezpośredni dostęp do pamięci". Jednostki peryferyjne, takie jak transceivery ADC/UART/RF oraz urządzenia pamięci, mogą być wymieniane bezpośrednio pod kontrolą "kontrolera DMA"Potrzebna jest niewielka interwencja CPU, co znacznie poprawia ogólną sprawność systemu. Bądźcie czujni! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|