Еще проект на модулях RFM (используем RFM42 или RFM43 и Atmega8)

Индикатор напряжения для авиамодели.

Параметры
Габариты – 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

 

2 комментария

  1. Конечно, пусть будет.
    Пожалуй, прошивку с исходником добавлю в заметку (чтоб не потерялись).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *