|
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] | | ADCCFG | AIN0~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++);
|