Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 10718|Отговор: 0

Zigbee Journey (6): Няколко важни основни експеримента с CC2430 - ADC единично семплиране

[Копирай линк]
Публикувано в 30.10.2014 г. 23:20:31 ч. | | | |
1. Свързване на горния и долния етаж

В безжичните сензорни мрежи е важно аналоговите стойности на сензорите да се преобразуват в цифрови величини за лесно предаване и обработка. ADC (аналогово-цифров конвертор) се използва за завършване на това преобразуване.

В предишната секция въведохме серийна портова комуникация между CC2430 и компютър. CC2430 има вграден температурен сензор вътре, а този раздел ще реализира прост експеримент за мониторинг на температурата на чипа, базиран на предишния раздел: използвайте ADC, за да преобразувате стойността на напрежението на сензора за температура в чипа в цифрова величина, използвайте формулата за изчисляване на стойността на температурата и след това предайте стойността на температурата към компютъра през серийния порт и я покажете.

2. Единично семплиране на ADC(1) Въведение в експеримента

ADC се използва за преобразуване на температурната стойност на температурния сензор CC2430 на чипа, а стойността на температурата се изпраща към компютъра през серийния порт и се показва.

(2) Схема на потока на програмата

(3) Експериментален изходен код и анализ/*
    Експериментално описание: Експериментът за измерване на температура в чипа изпраща данните към компютъра през сериен порт 0
*/

#include

#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
Празнотаxtal_init(Празнота)
{
  СЪН &= ~0x04;            //都上电
  докато(! (СЪН &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Изберете кристален осцилатор с честота 32MHz
  СЪН |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Празнотаled_init(Празнота)
{
  P1SEL =0x00;         P1 е нормалният I/O порт
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 изход
  
  led1 =1;
  led2 =1;
  led3 =1;
  LED4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Празнота  Uart0Init(без подпис ЧарStopBits,без подпис ЧарПаритет)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    настрой на UART режим и активирай акцептора
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Паритет;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Празнота  Uart0Send(без подпис Чарданни)
{
  докато(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = данни;
}

/*UART0发送字符串
-------------------------------------------------------*/
ПразнотаUart0SendString(без подпис Чар*s)
{
  докато(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
без подпис ЧарUart0Receive(Празнота)
{
  без подпис Чарданни;
  докато(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Връщанеданни;
}

/*延时函数
-------------------------------------------------------*/
ПразнотаЗабавяне(без подпис intn)
{
  без подпис inti;
  за(i=0; I<N; i++);
  за(i=0; I<N; i++);
  за(i=0; I<N; i++);
  за(i=0; I<N; i++);
  за(i=0; I<N; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
ПлатформаgetTemperature(Празнота)
{
  без подпис int  стойност;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Иницииране на преобразувания в AD            
   
  докато(! (ADCCON1 &0x80));           //等待ADC转化结束

  стойност = ADCL >>2;
  стойност |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  ВръщанеСтойност*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
Празнотаосновно(Празнота)
{
  Чарi;
  ПлатформаavgTemp;
  без подпис Чарoutput[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

  Uart0Init(0x00, 0x00);   //初始化串口:无奇偶校验,停止位为1位

  Uart0SendString("Здравей, CC2430 - TempSensor!");

  докато(1)
  {
    led1 =0;
    avgTemp =0;
    за(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Изход[0] = (без подпис Чар)(средно време)/10 + 48;         //十位
    Изход[1] = (без подпис Чар)(avgTemp)%10 + 48;         //个位
    Изход[2] ='.';                                       //小数点
    Изход[3] = (без подпис Чар)(средно време*10)%10+48;         //十分位
    Изход[4] = (без подпис Чар)(средно време*100)%10+48;        //百分位
    изход[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
    Забавяне(20000);
  }
}

За съдържанието на кода на серийната портова комуникация, моля, вижте предишния раздел, който тук няма да бъде обяснен~

ADC обикновено включват 6 SFR:

ADCCON1За общо управление на ADC, включително флаг за край на преобразуването, метод на задействане на ADC, генератор на случайни числа
ADCCON2Конфигурация за непрекъснато преобразуване на АЦП (този експеримент не включва непрекъснато преобразуване на АЦП и следователно не използва този SFR)
ADCCON3Конфигурация за едно преобразуване на АЦП, включително избор на референтно напрежение, резолюция, източник на преобразуване
ADCH[7:0]Високото ниво на резултата от конверсията на ADC, т.е. ADC [13:6]
ADCL[7:2]Ниското ниво на резултата от конверсията на ADC, т.е. ADC [5:0]
ADCCFGAIN0~AIN7 с P0.0~P0.7 като вход за ADC (този SFR не се използва, тъй като сензорът за температура на чипа е избран като източник на преобразуване в този тест и не включва AIN0~AIN7)

(Забележка: Моля, вижте китайското ръководство CC2430 за горните подробности за SFR)

След това нека се съсредоточим върху негоgetTempuratureфункция, която е ключът за получаване на температурната стойност:

(1) Първо, конфигурирайте АЦП за едно семплиране: задайте ADCCON3=0x3E, изберете 1.25V като системно напрежение, изберете 14-битова резолюция и изберете сензора за температура CC2430 на чипа като източник на преобразуване на ADC

(2) След това задайте ADCCON1 |= 0x30, за да зададете метода на задействане на ADC на ръчен режим (т.е. когато ADCCON.6=1, започнете прехода към ADC)

(3) След това нека ADCCON1 |= 0x40 за стартиране на единичната конверсия на ADC

(4) Използвайте изявлението докато(!( ADCCON1 &0x80)) Изчакайте края на прехода към ADC

(5) Резултатът от преобразуването се съхранява в ADCH[7:0] (8 бита височина), ADCH [7:2] (6 бита по-ниско) и преминава:

    стойност = ADCL >>2;
    стойност |= (ADCH <<6);   

Запазете резултата от конверсията в стойността

(6) Накрая, използвайте формулататемпература= стойност*0.06229-311.43, изчисли стойността на температурата и възвръщаемостта

Съвети за CC2430
Сигурно сте озадачени от последната формула, защо еднократна функция? Защо има наклон 0.06229 и пресичане 211.43? Добре, ето отговора:
Този температурен сензор се намира вътре в чипа CC2430, така че описанието му със сигурност може да се намери в ръководството му. И наистина, тук съмЕлектрически спецификацииРелевантното съдържание се намира в този раздел, а скрийншотът е следният:
Тази таблица описва температурата (°C) на температурния сензор спрямо изходното напрежение (V).
Първо погледнете втората червена кутия:Температурен коефициент。 "Коефициент"? Не ти ли се струва малко? После погледнете нейната единица: mV/°C и изведнъж ще осъзнаете, че връзката между температура и напрежение е линейна~ Тоест:
където V е изходната стойност на напрежението, T е температурната стойност, а 2.45 е наклонът. Пресичането b трябва да бъде определено по-долу.
На пръв поглед ще видим, че на първата червена кутия напрежението при 0°C е 743mV, така че b е равно на 743? В противен случай, ако продължите да гледате надолу, ще откриете, че абсолютната ѝ грешка достига до 8°C! След това, ако погледнем надясно, ще видим, че вече предоставя най-подходящия пресеч, т.е.: b=763, така че има следната формула:
Добре, сега вече имаме температурния сензорВъведете температура TиИзходно напрежение VСледващата стъпка е да намериш ADCВходно напрежение VиИзходна стойност N(т.е. резултата от преобразуване от 14 бита), и накрая да намери формулата за преобразуване на N и T.
Резултатът от преобразуването N е 14 бита, а когато N=11 1111 1111 1111 (двоично ниво), изходното напрежение трябва да е максималната стойност (т.е. референтно напрежение 1.25V). Следователно имаме следната пропорционална връзка:
(Забележка: Тъй като изходът на 14 бита е двоичен допълнение, 14-ият бит е символният бит.) Така че в абсолютни стойности ефективната стойност е само 13 бита, така че е 2 към степен на 13)
Комбинирайки двете формули, връзката между T и N може да се изведе:
КРАЙ~

Накрая, няколко думи за това защо са необходими 64 цикъла за всяка извадка. Тъй като сензорите неизбежно са подложени на смущения или случайни грешки при измерване на температурата, данните, получени от сензорите, понякога са преувеличени (например внезапна промяна от 10°C и след това мигновено връщане към нормалното). Но знаем, че промяната на температурата е интегрален процес и рядко се случва голям скок за миг). Затова използваме метода на средното, за да намалим такива грешки.

(4) Експериментални резултати

Първо отворете инструмента за дебъгване на серийни портове, след това изтеглете програмата и я стартирайте, и ще се появи следният екран:

Температурата вътре във филма е около 14.5°C. Авторът усеща стайната температура на общежитието с тялото си, която е малко над 10°C. Вътрешността на чипа трябва да се нагрее, така че 14°C е почти нормално~

Това е краят на експеримента.

3. Заключение

Тази статия описва внедряването на ADC single-sampling. В следващия раздел ще въведем режим за пренос на данниDMA(директен достъп до паметта), тоест "директен достъп до паметта". Периферни устройства като ADC/UART/RF трансивъри и паметни устройства могат да се обменят директно под контрола на "DMA контролера"Изисква се малко намеса от процесора, което значително подобрява общата ефективност на системата.

Останете на линия!


</n; i++);
</n; i++);
</n; i++);
</n; i++);
</n; i++);




Предишен:Zigbee Journey (5): Няколко важни основни експеримента с CC2430 – серийна комуникация
Следващ:Zigbee Journey (7): Няколко важни основни експеримента с CC2430 - DMA предаване
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com