Современная электроника №4/2024

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 46 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 4 / 2024 Листинг 1. Подпрограмма для работы с АЦП //----------------------------------- uint16_t ACP(uint8_t NK) { uint32_t accumulator = 0; // accumulator for averaging uint32_t result, mV; // mV - measured voltage in mV uint16_t rez; uint8_t measurements; // = 8 measurement counter ADC0MX = (NK == 1) ? ADC0MX_ADC0MX__ADC0P1 : ADC0MX_ADC0MX__ADC0P2; //NK=1/2 => ADC0MX=ADC0MX_ADC0MX__ADC0P1/ADC0MX_ADC0MX__ADC0P2 for (measurements = 0; measurements < 8; measurements++) { ADC0CN0_ADINT = 0; // clear ADC0 conv. complete flag ADC0CN0_ADBUSY = 1; // Start a conversion by setting ADBUSY while (!ADC0CN0_ADINT); // wait conversionComplete accumulator += ADC0; // DATA 0BDH ; ADC0 Data Word } //result = accumulator / 8; result = accumulator >> 3; // Vref (mV)/gain(=0,75) // measurement (mV) = ------------------------ * result (bits) // (2^14)-1 (bits) // Vref = 1,65 V = 1650 mV // 1650 mV / 0,75 = 2200 mV // (2^14)-1 = 16384-1=16383 mV = (result * 2200) >> 14; //mV = (result * 2200)/16383; rez = mV; return (rez); } //----------------------------------- в результате чего на экран выведется корпус МК со всеми портами ( рис . 4 ж ). Прежде всего , необходимо с помощью команд skip, которые отмечены крас - ными крестиками , передвинуть сигна - лы SPI в нижнюю часть корпуса , что - бы их можно было легко соединить с разъёмом OLED- дисплея ( см . рис . 2 в ). Порты P0.1 ( аналоговая « земля »), P0.2 ( аналоговый вход 1- го канала , ADC0.1) и P0.4 ( аналоговый вход 2- го канала , ADC0.2) настроить как анало - говые входы / выходы – Analog I/O ( при - мер – рис . 4 з ). Порты сопряжения МК с дисплеем ( см . также рис . 2 в ): P2.2 (MOSI), P2.0 (SCK), P1.6 (RES), P1.5 (D/C) и P1.4 (CS) настроить как циф - ровые выходы – Digital Push-Pull Output ( пример – рис . 4 и ). Порты P2.1 (MISO) и все остальные неиспользуемые порты настроить как цифровые входы – Digital OpenDrain I/O ( пример – рис . 4 к ). После того как все настройки сдела - ны , необходимо нажать на кнопку двой - ной дискеты в верхней левой области экрана , чтобы записать всю конфигу - рацию на диск . При этом на C51 авто - матически сгенерируется файл под - программы инициализации устройств InitDevice.c, которая подключится к основной программе , т . е . в самом нача - ле основной программы (Main) будет обращение к подпрограмме InitDevice.c: enter_DefaultMode_from_RESET();. Теперь по поводу самих подпро - грамм . Таких подпрограмм три . Первая – инициализация и очистка дисплея . Поскольку об этом подроб - но описано в [5], чтобы не повторять - ся , эта подпрограмма не приводится . Вторая – подпрограмма аналого - цифрового преобразования . Эта подпрограмма uint16_t ACP(uint8_t NK) организована в виде функции , аргу - ментом которой является номер канала (1 или 2), АЦП которого необходимо произвести , а полученный результат – это 16- разрядное (uint16_t ) значение самой функции . Вначале подпрограм - ма выясняет , какой канал необходимо подключить , и устанавливает значение мультиплексора на данный канал , а затем производит 8- кратное измере - ние напряжения по этому каналу и осредняет его . Далее , поскольку в каче - стве опорного напряжения использу - ется внутренний источник опорно - го напряжения 1,65 В и коэффициент усиления внутреннего ОУ , равный 0,75 ( см . рис . 4 а ), результат умножает - ся на 2200 мВ (= 1,65 В /0,75) и делится на 16 383 (2 14 – 1), так как разрядность АЦП – 14 бит . С погрешностью в 1 бит в качестве делителя можно использовать число 16 384 (2 14 ), или , другими слова - ми , вместо деления , которое произво - дится достаточно долго , можно исполь - зовать простой сдвиг результата на 14 разрядов вправо . Обращение к этой подпрограмме очень простое . Напри - мер , чтобы измерить напряжение пер - вого канала U1, необходимо написать : U1 = ACP(1); ( см . далее ). Для приблизительной оценки вре - мени аналого - цифрового преобразова - ния двух каналов , с учётом 8- кратного измерения по каждому каналу , необхо - димо учесть , что максимальное время одного АЦП составляет 1,167 мкс ( см . рис . 4 а ). Умножив это время на 8 и учи - тывая , что каналов 2, получим : Т АЦП = = 1,167 мкс × 8 × 2 = 18,672 мкс | 20 мкс . Подпрограмма с комментариями приведена в листинге 1. Эта подпро - грамма взята из одного из примеров работы с АЦП в Simplisity Studio, поэ - тому некоторые комментарии оставле - ны в оригинальном виде . Третья подпрограмма – вывод гисто - граммы на дисплей . Но прежде чем её описывать , сделаем некоторое отсту - пление . Дисплей OLED 1306 состоит из 8 строк по 8 пикселей по вертикали в каждой строке . Верхние две строки име - ют жёлтый цвет , остальные – синий . Количество столбцов в дисплее 128. Имеет смысл синий цвет (6 нижних строк ) использовать как нормальный режим работы , т . е . когда уровень звука не выходит за предел , в котором могут возникнуть искажения , а жёлтый цвет – как начало режима , в котором уровень звука находится выше этого предела . Чтобы соотношение уровня звука выше предела и нормального режима было наиболее реальным , для жёлтого цве - та желательно использовать всего одну строку , т . е . отношение количества пик - селей жёлтого цвета и количества пик - селей нормального режима составляло 1/7, или , другими словами , использо - вать 7 строк , а 8- ю строку не исполь - зовать . Поскольку максимальное напряже - ние , подаваемое на АЦП , составляет 2200 мВ ( см . выше ), имеет смысл оце - нить , каким образом строить столбец , высота которого пропорциональна входному напряжению . Максималь - ная высота столбца составляет 7 строк × × 8 пикселей = 56 пикселей . То есть 56 пикселей должны отображать 2200 мВ . Если разделить 2200 мВ на 56 пик - селей , получим : 2200 мВ / 56 = 39, 27 мВ | | 40 мВ . Если принять , что 40 мВ состав - ляет 1 пиксель , то получим , что дисплей может отражать : 40 мВ × 56 пикселей = = 2240 мВ , что даже чуть больше , чем

RkJQdWJsaXNoZXIy MTQ4NjUy