Индикатор напряжения для авиамодели.
Параметры
Габариты – 22*25*8 мм
Напряжение питания – 5-25 вольт
Диапазон рабочих частот – частоты LPD, PMR, FRS, GMRS стандартов.
Тип питающего АКБ – LiPo , автоопределение
Выходная мощность – до 50 мВт
Число одновременно работающих радиочастот — 3 (канал контроля батареи, канал поиска, канал передачи данных ), програмируются при изготовлении.
Cамостоятельная сборка.
Радиоиндикатор является несложным устройством, доступным для самостоятельного изготовления . Для успешной сборки кроме комплекта деталей и паяльника необходим программатор микросхемы AtMega8. Схем и ПО для программирования в интернете представлено великое множество, можно использовать любые доступные.
Устройство радиоиндикатора.
Радиомаяк – радиоиндикатор батареи состоит из следующих основных узлов
Стабилизатор питания DA1
Микропроцессор DD1
Радиомодуль M1
Цепь замера напряжения R1,R2,C1
Перечень элементов
DA1 — KF33 или LP2950CZ-3.3 (внимание — другой тип корпуса!)
DD1 — Atmega8-16AU или Atmega8L-8AU
M1 — RFM42-433-S1 или S2
C1,C2,C3 – 0,1 мкф * 50 вольт керамический
C4 -10 мкф* 16 вольт электролитический
R1 – 1 ком
R2 — 8,2 ком
Проект развивается и поддерживается сайтом www.1slon.ru, там же можно скачать и исходные тексты и прошивки.
Добавлено: 21.11.2012 г.
А вот исходный код программы (если хотите скопировать себе, воспользуйтесь лупой в правом верхнем углу окошка ↓ ):
/***************************************************** This program was produced by the CodeWizardAVR V1.25.7 beta 5 Professional Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 18.06.2010 Author : }{вост {лона Company : zoo Comments: Работает на трех каналах одновременно 1) Как обычный индикатор, только без несущей и с индикацией каждой минуты 2) Тональные посылки с увеличивающейся мощностью. 3) Цифровые посылки Chip type : ATmega8 Clock frequency : 8,00000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 16 *****************************************************/ #include <mega8.h> #include <delay.h> #include <spi.h> #define u8 unsigned char #define u16 unsigned int #define s16 signed int #define NSEL PORTB.2 #define SHUTDOWN PORTB.1 #define IRQ PIND.7 #define SN 1 #define CH_BATT 433.550 #define CH_FIND 434.550 #define CH_DIGI 866.700 #define spi8x spi bit time=0; char tx_buf[64]; unsigned int u_battery = 512; flash char RfSettingsA []={0x3B, 0x34, 0x02, 0x75, 0x25, 0x05, 0xEA, 0x4E, 0xA5, 0x28, 0x06, 0x00, 0x80}; //DR: 4.8kbps, DEV: +-4kHz, BBBW: 25.3kHz // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { static u16 tmp; // каждые 65 535 микросекунд // 1 секунда = 1 000 000 / 65535 = 15.26 // 1 минута = 15.26*60=915 tmp++; if (tmp== 915 ) { tmp=0; time=1; } } #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /* // программный ЭСПИАЙ void spi8x (char a) {char n; for (n=0;n<8;n++) { delay_us(2); if (a & 0x80) MOSI=1; else MOSI=0; a<<=1; delay_us(2); SCK=1; delay_us(2); SCK=0; delay_us(2); } } */ // char RFXX_WRT_CMD(unsigned int aCmd) { char spi_data; NSEL=0; spi_data=(char) (aCmd>>8); spi_data=spi_data | 0x80; spi8x( spi_data ); spi8x((char)(aCmd & 0x00FF)); NSEL=1; return 1; } char RFXX_READ_CMD(unsigned int aCmd) { char spi_data; NSEL=0; spi( (char) (aCmd>>8) ); spi_data=spi((char)(aCmd & 0x00FF)); NSEL=1; return spi_data; } void set_power ( char power) { // ONLY RFM 42 !!!!!!!!!!!!!!! if (power>3)power=3; RFXX_WRT_CMD(0x6D00+(int)power); } /* void beep (char tone, char len) { char a; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_WRT_CMD(0x6e00+(int)tone); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x3e00); // paket lendht 0 byte RFXX_WRT_CMD(0x3080); //data acess control No CRC No TX handling RFXX_WRT_CMD(0x3308); // header control No header, fix pkt len RFXX_WRT_CMD(0x7206); // deviation 6*625=3750 hz RFXX_WRT_CMD(0x3400+(int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x0701); for (a=0;a<3;a++) {RFXX_WRT_CMD(0x7FAA);} RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием // while (IRQ){} //ждем окончания передачи // RFXX_WRT_CMD(0x0701); // выключить передатчик } */ void beep (char tone, int len) { int a; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_READ_CMD(0x0300); // сбросить прерывания RFXX_READ_CMD(0x0400); RFXX_WRT_CMD(0x6e00+(int)tone); // tx data rate - частота тона 0x2752*1000/2097152=4.8 kbit //RFXX_WRT_CMD(0x6e0A); // tx data rate - частота тона 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x3e01); // paket lendht 0 byte //RFXX_WRT_CMD(0x3080); //data acess control No CRC No TX handling //RFXX_WRT_CMD(0x3308); // header control No header, fix pkt len RFXX_WRT_CMD(0x308C); //data acess control No CRC No TX handling RFXX_WRT_CMD(0x3318); // header control No header, fix pkt len RFXX_WRT_CMD(0x7203); // deviation 6*625=3750 hz //RFXX_WRT_CMD(0x3400+(int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x3400+(unsigned int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x0803); // clear fifo rx + tx RFXX_WRT_CMD(0x0800); // RFXX_WRT_CMD(0x0504); // irq - after send packet for (a=0;a<3;a++) {RFXX_WRT_CMD(0x7FAA);} RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием while (IRQ){} //ждем окончания передачи //for (a=0; a<len; a++) delay_ms(1); //delay_ms(300); RFXX_WRT_CMD(0x0701); // выключить передатчик delay_ms(10); RFXX_WRT_CMD(0x0700); // выключить передатчик } void send_pkt (void) { char f,crc; tx_buf[0]=SN; // серийный номер системы tx_buf[1]=0x07; // 0000 0111 присутствует напряжение, бародатчик, гпс tx_buf[2]=0; // тип данных в пакете - резерв tx_buf[3]=0; // резерв tx_buf[4]=0; // флаги - (ап-доун и пр.)резерв tx_buf[5]=(char)(u_battery>>8); tx_buf[6]=(char)u_battery; // f_hi=(unsigned int)baroalt; // tx_buf[7]=(char)(f_hi>>8); // tx_buf[8]=(char)f_hi; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_READ_CMD(0x0300); RFXX_READ_CMD(0x0400); RFXX_WRT_CMD(0x3e08); // paket lendht 8 byte RFXX_WRT_CMD(0x308F); //data acess control ПРОВЕРИТЬ old 8c (hand enable RX+TX crc OFF) RFXX_WRT_CMD(0x3310); // header control (18) ПРОВЕРИТЬ old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x6e00+RfSettingsA[7]); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6f00+RfSettingsA[8]); // + tx data rate RFXX_WRT_CMD(0x7000+RfSettingsA[9]); // + modulation mode control RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_WRT_CMD(0x7200+RfSettingsA[0x0A]); // deviation 48 - 40khz 0x48*625=45000 hz 8*625=5000 hz RFXX_WRT_CMD(0x3464); //preamble lenght *4 period = 8 байт RFXX_WRT_CMD(0x3e00+50); // set paket lendht RFXX_WRT_CMD(0x0803); // clear fifo rx + tx RFXX_WRT_CMD(0x0800); // crc=0; for (f = 0; f<50; f++){RFXX_WRT_CMD(0x7f00+tx_buf[f]); crc=crc^tx_buf[f];} // забить в модуль собраный пакет RFXX_WRT_CMD(0x7f00+crc); // TEST RFXX_WRT_CMD(0x0504); // irq - after send packet RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием while (IRQ){} //ждем окончания передачи RFXX_WRT_CMD(0x0701); // выключить передатчик } // ------------------------------------------------------------------------------ //базовая частота в мегагерцах (например 433.920)
void set_full_freq(float freq) { u8 reg75,reg76, reg77,reg75out; u16 tmp; if (freq <480) {reg75=(freq/10)-24; reg75out=reg75; } else {reg75=(freq/20)-24; reg75out=reg75 | 0x20;} if ( freq < 480 ) tmp=(u16)(((freq/10)-reg75-24)*64000); else tmp=(u16)(((freq/20)-reg75-24)*64000); reg76= (u8)(tmp>>8); reg77= (u8)(tmp & 0x00FF); RFXX_WRT_CMD(0x7500+reg75out); RFXX_WRT_CMD(0x7600+reg76); // carrier freq 310 + (0x6400/64000) =314.000 mhz RFXX_WRT_CMD(0x7700+reg77); // carrier freq ((a*256)+b)/64000=0,4 } //-------------------------------------------------------------------------------- // ????????? ????? ? ???????? ???????? (??? ?? ??????) ?? ?????? (???? 43 ??? -18) ???????? // сдвиг частоты со знаком, в килогерцах в верхнем диапазоне
void set_offset_freq (s16 offset) { if (offset != 0) offset=(offset*32)/10; if (offset > 512) offset= 512; // 512*0.3125 khz = 160 khz if (offset < -512) offset=-512; RFXX_WRT_CMD(0x7400+((offset >> 8)& 0x00FF) ); // freq offset RFXX_WRT_CMD(0x7300+( offset & 0x00FF) ); // freq offset //RFXX_READ_CMD(0x7300); // freq offset //RFXX_READ_CMD(0x7400); // freq offset } //---------------------------------------------------------------------------------- void main(void) { // Declare your local variables here char set, i,u,n_lipo; unsigned int batt; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T PORTB=0x00; DDRB=0x2C; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=P State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x80; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 250,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x85; // SPI initialization // SPI Type: Master // SPI Clock Rate: 2000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; // Global enable interrupts #asm("sei") NSEL=1; SHUTDOWN=1; delay_ms(500); SHUTDOWN=0; delay_ms(200); RFXX_WRT_CMD(0x0600); // disable 2-nd interrupt RFXX_WRT_CMD(0x0701); // set ready mode RFXX_WRT_CMD(0x0900+116); // capacitor zq RFXX_WRT_CMD(0x0a05); // clock for cpu RFXX_WRT_CMD(0x0bf4); // rxdata on gpio0 RFXX_WRT_CMD(0x0cef); // gpio RFXX_WRT_CMD(0x0d00); // gpio RFXX_WRT_CMD(0x0e00); // io RFXX_WRT_CMD(0x0f70); //adc RFXX_WRT_CMD(0x1000); // adc RFXX_WRT_CMD(0x1200); // temp RFXX_WRT_CMD(0x1300); // temp // handler RFXX_WRT_CMD(0x308C); //data acess control old 8c (hand enable RX+TX crc OFF) RFXX_WRT_CMD(0x3318); // header control (18) old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x34ff); //preamble lenght old 40 теперь 20 бит RFXX_WRT_CMD(0x3520); //preamble detection control RFXX_WRT_CMD(0x362d); //sync word RFXX_WRT_CMD(0x37d4); //sync word !! 37-й регистр это будет серийник передатчика RFXX_WRT_CMD(0x3800); //sync word RFXX_WRT_CMD(0x3900); //sync word RFXX_WRT_CMD(0x3a31); //header RFXX_WRT_CMD(0x3b32); //header RFXX_WRT_CMD(0x3c33); //header RFXX_WRT_CMD(0x3d34); //header RFXX_WRT_CMD(0x3e02); // paket lendht 12 byte RFXX_WRT_CMD(0x6a0b); //agc override RFXX_WRT_CMD(0x6d07); // tx power - 03 - full RFXX_WRT_CMD(0x6e00+RfSettingsA[7]); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6f00+RfSettingsA[8]); // + tx data rate //RFXX_WRT_CMD(0x6e05); // + tx data rate 0x2752*1000/2097152=4.8 kbit //RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x7000+RfSettingsA[9]); // + modulation mode control RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_WRT_CMD(0x7200+RfSettingsA[0x0A]); // deviation 48 - 40khz 0x48*625=45000 hz 8*625=5000 hz RFXX_WRT_CMD(0x7553); // band select 73 for 868 mhz RFXX_WRT_CMD(0x7900); //+ hopping channel RFXX_WRT_CMD(0x7a00); //+ hopping step 10 khz delay_ms(1000); //=========================================================================================================================== //=================================================================================================================== // установка режимов передачи //RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x7122); // 22 - fifo RFXX_WRT_CMD(0x308C); //data acess control old 8c (hand enable RX+TX crc OFF) //RFXX_WRT_CMD(0x3211); // header control check 0 byte 0 byte RFXX_WRT_CMD(0x3318); // header control (18) old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x34ff); //preamble lenght old 40 теперь 20 бит RFXX_WRT_CMD(0x3520); //preamble detection control RFXX_WRT_CMD(0x362d); //sync word RFXX_WRT_CMD(0x37d4); //sync word !! RFXX_WRT_CMD(0x3800); //sync word RFXX_WRT_CMD(0x3900); //sync word RFXX_WRT_CMD(0x3a31); //header RFXX_WRT_CMD(0x3b32); //header RFXX_WRT_CMD(0x3c33); //header RFXX_WRT_CMD(0x3d34); //header RFXX_WRT_CMD(0x3e02); // paket lendht 12 byte RFXX_WRT_CMD(0x0701); set_full_freq (CH_DIGI); RFXX_WRT_CMD(0x0702); RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x0709); delay_ms(5000); RFXX_WRT_CMD(0x0701); set_full_freq (CH_BATT); RFXX_WRT_CMD(0x0702); RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x0709); delay_ms(5000); RFXX_WRT_CMD(0x0701); u_battery=(unsigned int)(((float)read_adc(7))*0.818); batt=(unsigned int)(((float)read_adc(7))*2.985); // ???????????, ?????????? ? ????????? ???? ??????? if (batt > (420*5) ) n_lipo=6; // 6 ???? else if (batt > (420*4) ) n_lipo=5; // 5 ???? else if (batt > (420*3) ) n_lipo=4; // 4 ???? else if (batt > (420*2) ) n_lipo=3; // 3 ???? else if (batt > (320*2) ) n_lipo=2; // 2 ???? else if (batt > (420*1) ) n_lipo=0; // 5 ????? ???? else n_lipo=1; // 1 ???? ??? 3 ?????? set_full_freq (CH_BATT); set_power (3); if (n_lipo) { for (i=0;i<n_lipo;i++) { beep (7, 0x40); delay_ms(100); } delay_ms(1000); for (i=0;i<n_lipo;i++) { beep (7, 0x40); delay_ms(100); } delay_ms(1000); for (i=0;i<n_lipo;i++) { beep (7, 0x40); delay_ms(100); } } else { for (i=0;i<20;i++) { beep (6, 0x20); delay_ms(50); } } while(1) { u_battery=(unsigned int)(((float)read_adc(7))*0.818); // замер напряжения для звука batt=(unsigned int)(((float)read_adc(7))*2.985); // замер напряжения для цифрю канала if (n_lipo) { if (batt < (300*(unsigned int)n_lipo) ){u=4;} else if (batt < (310*(unsigned int)n_lipo) ){u=3;} else if (batt < (320*(unsigned int)n_lipo) ){u=2;} else if (batt < (330*(unsigned int)n_lipo) ){u=1;} else u=0; } else { if (batt < 430 ){u=3;} else {u=0;} } set_full_freq (CH_FIND); set_power (3); beep (9, 0xC0); delay_ms(100);// tone len set_power (2); beep (9, 0x20); // tone len set_full_freq (CH_DIGI); set_power (3); send_pkt(); set_full_freq (CH_FIND); set_power (1); beep (9, 0x20);delay_ms(100); // tone len set_power (0); beep (9, 0x20); // tone len set_full_freq (CH_DIGI); set_power (3); send_pkt(); set_full_freq (CH_BATT); set_power (3); switch (u) { case 0: delay_ms(500); if (time) {time=0; beep (9, 0x40); delay_ms(100); beep (9, 0x40); } break; case 1: if (set){set=0; beep (5, 0xC0); } else {set=1; delay_ms(500);} break; case 2: if (set){set=0; beep (7, 0xC0); } else {set=1; delay_ms(500);} break; case 3: beep (8, 0xC0); break; default: beep (9, 0x40); delay_ms(100); beep (9, 0x40); delay_ms(100); beep (9, 0x40); delay_ms(100); beep (9, 0x40); delay_ms(100); break; } set_full_freq (CH_DIGI); set_power (3); send_pkt(); } //end while 1 } // end main
Еле нашел ссылку на прошивку!
На том сайте она уж очень глубоко спрятана.
Добавьте здесь. Пусть будет: http://www.1slon.ru/faq.php?cat_id=5
Конечно, пусть будет.
Пожалуй, прошивку с исходником добавлю в заметку (чтоб не потерялись).