Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 10718|Ответ: 0

Zigbee Journey (6): Несколько важных базовых экспериментов CC2430 — одиночная дискретизация ADC

[Скопировать ссылку]
Опубликовано 30.10.2014 23:20:31 | | | |
1. Соединение верхнего и нижнего уровней

В беспроводных сенсорных сетях важно преобразовывать аналоговые значения датчиков в цифровые величины для удобства передачи и обработки. Для завершения этого преобразования используется АЦП (аналогово-цифровой преобразователь).

В предыдущем разделе мы ввели связь с последовательным портом между CC2430 и ПК. В CC2430 встроен датчик температуры, и в этом разделе будет реализован простой эксперимент по мониторингу температуры на чипе на основе предыдущего раздела: использовать АЦП для преобразования значения напряжения датчика температуры на чипе в цифровую величину, использовать формулу для расчёта значения температуры, затем передать значение температуры на ПК через последовательный порт и отобрать его.

2. Одиночная дискретизация АЦП(1) Введение в эксперимент

АЦП используется для преобразования температурного значения внутричипового датчика температуры CC2430, которое отправляется на ПК через последовательный порт и отображается.

(2) Блок-схема программы

(3) Экспериментальный исходный код и анализ/*
    Описание эксперимента: Внутричиповый эксперимент по усвоению температуры отправляет данные на ПК через последовательный порт 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
пустотаxtal_init(пустота)
{
  SLEEP &= ~0x04;            //都上电
  в то время как(! (SLEEP &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Выберите кристаллический осциллятор на 32 МГц
  СОН |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
пустотаled_init(пустота)
{
  P1SEL =0x00;         P1 — это обычный порт ввода-вывода
  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)
{
  Без подписания intя;
  для(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;        //根据公式计算出温度值
}

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

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

  Uart0SendString(«Здравствуйте, CC2430 — Датчик температуры!");

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

Для содержания кода связи через последовательные порты, пожалуйста, обратитесь к предыдущему разделу, который здесь не будет объясняться~

АЦП обычно включают 6 СФР:

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

(Примечание: пожалуйста, обратитесь к китайскому руководству CC2430 для получения вышеуказанных деталей SFR)

Далее давайте сосредоточимся на этомgetTempuratureФункция, которая является ключом к получению значения температуры:

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

(2) Затем установить ADCCON1 |= 0x30 для ручного триггера метода АЦП (то есть при ADCCON.6=1 начать переход к АЦП)

(3) Затем пусть ADCCON1 |= 0x40 для запуска одиночного преобразования АЦП

(4) Используйте утверждение while(!( 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).
Первый взгляд на вторую красную коробку:Температурный коэффициент。 «Коэффициент»? Разве это не кажется немного странным? Затем посмотрите на его единицу: мВ/°C, и вы вдруг поймёте, что связь между температурой и напряжением линейна~ То есть:
где V — выходное напряжение, T — температурное значение, а 2,45 — наклон. Перехват b должен быть определен ниже.
На первый взгляд мы увидим, что на первой красной коробке напряжение при 0°C составляет 743 мВ, то есть b равно 743? В противном случае, если продолжить смотреть вниз, то абсолютная ошибка достигает 8°C! Затем, глядя вправо, мы увидим, что он уже даёт наиболее подходящий перехват, то есть b=763, так что существует следующая формула:
Хорошо, теперь у нас уже есть датчик температурыВведите температуру TиВыходное напряжение VСледующий шаг — найти ADCВходное напряжение VиВыходное значение N(то есть результат преобразования 14 бит), и наконец найти формулу преобразования N и T.
Результат преобразования N равен 14 битам, и когда N=11 1111 1111 1111 (бинарное), выходное напряжение должно быть максимальным значением (то есть опорное напряжение 1,25 В). Таким образом, у нас есть следующая пропорциональная зависимость:
(Примечание: поскольку выход 14 бит является бинарным дополнением, 14-й бит — это бит символа.) Таким образом, в абсолютных выражениях эффективное значение составляет всего 13 бит, то есть 2 к степени 13)
Объединив две формулы, можно вывести связь между T и N:
ПРИЁМ~

Наконец, несколько слов о том, почему для каждого образца требуется 64 цикла. Поскольку датчики неизбежно подвержены помехам или случайным ошибкам при измерении температуры, данные, полученные датчиками, иногда преувеличиваются (например, внезапное изменение на 10°C и мгновенное возвращение к норме). Но мы знаем, что изменение температуры — это интегральный процесс, и редко случается крупный скачок мгновенно). Поэтому мы используем метод усреднения для снижения таких ошибок.

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

Сначала откройте инструмент отладки последовательных портов, затем скачайте программу и запустите её, и появится следующий экран:

Температура внутри пленки составляет около 14,5°C. Автор ощущает комнатную температуру общежития своим телом, которая чуть превышает 10°C. Внутренняя часть чипа должна нагреться, поэтому 14°C — это практически нормально~

Это конец эксперимента.

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

В этой статье описывается реализация единой дискретизации АЦП. В следующем разделе мы представим режим передачи данных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