Saturday, 31 December 2016

Простой способ измерения напряжения питания на ATmega328P.

Одно из обязательных требований для устройств работающих автономно (на батарейках к примеру), является контроль источника питания. В различных  датчиках эта информация включается в поток телеметрии и пользователь может оценить требует ли устройство обслуживания  или нет. Очень часто, в целях экономии энергии источника питания, (да и вообще в целях экономии) в простых датчиках не используют преобразователей напряжения , подключая схему непосредственно к источнику (батарейке, аккумулятору). Этому способствует диапазон питающих напряжений у современной элементной базы. Например, для ATmega328P   - 1,8...5,5В; для SI7021(датчик влажности и температуры) - 1,9...3,6В; для передатчика RFM85W-433  - 2,1...5В. Таким образом измерив напряжения питания мы можем непосредственно оценить состояние батарейки, аккумулятора. Как же это сделать?

 Для примера можно использовать готовые платы Arduino - Nano, Uno, Pro Mini и тд любая с ATmega328P на борту.

Идея измерения заключается в использовании входного сигнала АЦП ATmega328P как опорного , а опорное напряжение превращается в объект измерения. Рассмотрим схему из даташита ATmega328P:

ATmega328P ADC
 Как видим имеется 3 источника опорного напряжения AVCC (напряжение питания), INTERNAL 1,1V, AREF(внешнее опорное напряжение)  и 11 коммутируемых входа среди которых есть вход BANDGAP REFERENCE  напряжение на котором равно 1100 мВ (типовое).

Стандартный путь - привести напряжение питания к 1100 мВ внутреннего опорного источника (резистивным делителем) и подключить его к одному из входов ADC0...ADC7.

Пойдем же другим путем. На вход АЦП подадим BANDGAP REFERENCE (1100мВ), опорное напряжение установим AVCC (напряжение питания). Значение АЦП определяется как

                                                       ADC=(Vвх*1024)/Vоп, где

 Vвх - напряжение на входе АЦП, мВ
  Vоп - опорное напряжение, мВ
ADC - результат преобразования АЦП 0-1023


Перепишем это выражение для нашего случая:

                                                        ADC=(Vbg*1024)/Vavcc, где

 Vbg - напряжение BANDGAP REFERENCE, 1100мВ
 Vavcc - напряжение питания, мВ

Тогда напряжение питания определится как:

                                                       Vavcc =(Vbg*1024)/ADC=(1100*1024)/ADC, мВ


Вот и все. И никаких дополнительных элементов. На языке С  (Atmel Studio 7)  и для платы Arduino Nano это может выглядеть так:

#define F_CPU 16000000UL

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <util/delay.h>


#define UART0_U2X 1

enum{IDLE,ADC_NOISE_REDUCTION,POWER_DOWN,POWER_SAVE,STANDBY=6,EXTERNAL_STANDBY};
#define SET_SLEEP_MODE(A)  SMCR&=(0x01);SMCR|=(A<<1)

void InitADC(void){

 // На вход АЦП подаем BANDGAP REFERENCE (1100мВ), опорное напряжение установим AVCC (напряжение питания).
 ADMUX=(1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1);

 //задаем тактовую частоту АЦП (62 или 125 кГц зависит от частоты задающего генератора //ATmega328P )
 ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

}

void UartUnoInit(uint32_t baud){ //Parity Mode Disable, 1 Stop Bit, Character Size=8 bit, Baudrate=9600
 uint16_t cbrr=(uint16_t)(F_CPU/(8*(2-UART0_U2X)*baud)-1);

 UBRR0H = (uint8_t)(cbrr>>8);
 UBRR0L = (uint8_t)cbrr;
 
 _delay_ms(100);
 if(UCSR0A&(1<<RXC0)){
  (void)UDR0;
 }
 
 /* Enable receiver and transmitter */
 UCSR0B|= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
 
 //Double the USART Transmission Speed
 if(UART0_U2X==1){
  UCSR0A|=(1<<U2X0);
 }
}


void UartUnoTransmitByte(uint8_t data)
{
 /* Wait for empty transmit buffer */
 while ( !( UCSR0A & (1<<UDRE0)));
 /* Put data into buffer, sends the data */
 UDR0 = data;
}

void UartUnoTransmitData(uint8_t *data){
 while((*data)!='\0'){
  UartUnoTransmitByte(*data);
  data++;
 }
}

void UartUnoWaitEndTransmitData(void){
    while( !( UCSR0A & (1<<TXC0)));
    UCSR0A|=(1<<TXC0); 
}


void InitWDT(void){
    WDTCSR |= (1<<WDCE) | (1<<WDE);
    WDTCSR=(1<<WDIE)|(1<<WDP3)|(1<<WDP0); 
}

ISR(WDT_vect){            //awake every 8 sec
 uint16_t ubt;
 char string[32]={0};
   
 ADCSRA|=(1<<ADEN);
 _delay_ms(1);
 ADCSRA|=(1<<ADSC);
 while((ADCSRA&(1<<ADSC))!=0);
 ubt=(1100UL*1024)/ADC;
 ADCSRA&=(~(1<<ADEN));
 
 sprintf(string,"AVCC=%5umV\r\n",ubt);
 UartUnoTransmitData((uint8_t *)string);
        UartUnoWaitEndTransmitData(); 
}


int main(void)
{
 InitADC();
 UartUnoInit(115200);
 InitWDT();
 SET_SLEEP_MODE(POWER_DOWN);

 sei();
 sleep_enable();    
 while (1) 
    {
      sleep_cpu();
    }
}

Результат работы прораммы можно увидеть на любом мониторе последовательного порта (например Hercules).

Thursday, 22 December 2016

Замечание по поводу модуля питания МВ-102...

MB-102
MB-102 schematic

МВ-102 предназначен для установки на макетную плату и формирует напряжения +5В, +3,3В от внешнего источника питания с напряжением до +12В.

MB-102 breadboard
И все бы ничего, но пришла мысль проверить работу китайского сверхрегенеративного приемника на 3,3В. Схема собрана , напряжение подано - и на выходе приемника обнаруживается сигнал не имеющий ничего общего с поданным на его вход - меандр с частотой где-то 50КГЦ. Никакие манипуляции со входным сигналом ни к чему не приводили.
Переключил на 5В - приемник заработал в нормальном режиме. Вывод - проблемы с 3,3В - похоже он "гудит". И действительно, на осциллографе видна пульсация с частотой около 50КГЦ на источнике напряжения 3,3В.

Напряжения 5В и 3,3В формируют микросхемы AMS1117-5.0  AMS1117-3.3 соответственно. Для стабильной работы микросхемы рекомендацией разработчика является требование установки емкости номиналом не менее 22мкФ на выходе AMS1117 (выводы 1,2):

<<The circuit design used in the AMS1117 series requires the use of an output capacitor as part of the device frequency compensation.The addition of 22uF solid tantalum on the output will ensure stability for all operating conditions.>>

 На выходе AMS1117-5.0 (+5В) разработчик платы МВ-102 установил емкость 100мкф (микросхема не "гудит"), а на выходе AMS1117-3.3 присутствует только керамическая емкость о номинале которой можно сказать, что его явно недостаточно (судя по схеме это 0,1 мкф).

Лечение: Установите электролитическую емкость на монтажной плате номиналом 100мкф 6,3В как можно ближе к модулю МВ-102 или напаяйте ее прямо на выводы 1 (минус емкости )и 2 (плюс емкости) AMS1117-3.3 непосредственно на плате модуля или замените С4 (по схеме) на керамическую емкость 22 мкФ 6,3В.
AMS1117


MB-102 repair

Saturday, 17 December 2016

Супергетеродинный приемник RFM83C-433S китайской фирмы HopeRF.

 RFM83C-433S Front View




Параметры:

Диапазон частот ....                   433,92 МГЦ
Чувствительность                     -108 dBm
Модуляция .....                            ООК
Скорость передачи данных до  0,3-2,5 КГц/с
Напряжение питания                 3,6-5В
Ток потребления                         5 мА
Температурный диапазон          -20...+70 С
Ориентировочная цена              1,4$
Совместим с системой ARDUINO.

Назначение выводов:

 RFM83C-433S Schematic View
Для нормальной работы приемника необходимо вывод SHUT соединить с выводом GND и подключить антенну (если быстро и дешево - отрезок медной проволоки диаметром 0,4-0,6мм и длиной 17 см) к выводу ANT.   Дополнительных настроек через микропроцессор не требуется. Включил и работай.

На генераторе приемник ведет себя  так как и записано в даташите.  Уверенно принимая при 1мкВ. Скорость передачи данных проверена от 50ГЦ до 5КГЦ. Полоса приема +-200КГЦ от 433,92 МГЦ.

Купил этот приемник на замену известному китайскому сверхрегенератору:
Сверхрегенеративный китайский приемник


Но установив  RFM83C-433S вместо него был немного озадачен - приема сигналов передатчика не было. Вернул СРП на место - прием есть. Что бы это могло быть?
Как оказалось, время отработки АРУ приемника приблизительно 100 мСек ( напряжение на емкости С4). В этом промежутке времени сигнал может приниматься некорректно.  Поэтому решением было увеличение приамбулы в сигнале передатчика до 120 мСек. Ввиду этого, для нормальной работы приемника,  сигнал передатчика должен присутствовать постоянно или иметь приамбулу не менее 100 мСек, что с энергетической точки зрения не всегда приемлемо. Кроме того это, скорее всего, исключает возможность надежного приема уже существующих передатчиков не имеющих указанных параметров сигнала.

Шумы присутствуют на выходе приемника постоянно в отсутствие сигнала. Но это не является его недостатком , а скорее всего говорит о том, что для их подавления не используется порог . Введение порога понижает чувствительность приемника, а для подавления шумов следует предусмотреть приамбулу достаточной длительности в сигнале передатчика

Saturday, 3 December 2016

Передатчик китайской фирмы HopeRF RFM85W-433D.


 RFM85W-433D Front & Back View


Частота                        433,92 МГЦ
Выходная мощность   12dBm (16mW, 3.3V, 24mA); 16dBm(40mW, 5V, 40mA)
Вид модуляции            ООК
Габариты:                    16x12x4,8 мм
Питание                       2.1...5V
Цена                              1.35$

Справка - PdBm=10*LOG10(Px/P1mW); отсюда Px=10^(PdBm/10) ; Px в mW 
                   OOK - ON OFF KEY - буквально передатчик включается и выключается 
                  ПАВ - в нашем случае резонатор на поверхностных акустических волнах 

Схема передатчика проста как двери. На одном транзисторе собран генератор на ПАВ. На другом - усилитель мощности и все это коммутируется по базам через вход DATA. Благодаря имеющемуся разъему передатчик может быть быстро подключен к платам управления , например, Arduino Nano, Uno и тд. Но без пайки не обойтись - необходимо не забыть припаять антенну к гнезду ANT.

Важным достоинством передатчика является его свойство "включай и работай" - никаких  настроек не требуется.
  
Антенну можно легко изготовить , например, такую:

Antenna 433MHZ
где длина короткого отрезка - 17мм длинного - 53мм;  катушка - 16 витков на диаметре 2.5мм
и все это выполнено медным проводом диаметром 0.6мм и ,наконец, изделие коротким концом припаивается к контакту ANT.

В заключение скажу, что если в известной китайской паре приемник - передатчик
Сверхрегенеративный китайский приемник китайский передатчик
передатчик заменить на RFM85 выигрыш в дальности связи может быть существенным.