Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MEGA8 на ADC держит 5В как измерить +12В от авто 
V
    Опции темы
kaspersky89
Дата 24.9.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Решил брату "фишку" в его девятку сделать, Тахометр + вольтметр(чтоб вовремя среагировать если что).   Вообщем тема такая сделал схему в Proteus-е. Написал программу на WinAvr. Всё нормально, Вместил в корпус от китайских часов(резисторы и транзисторы + микрухи в чип варианте ).
  Ещё фишка - при подаче питания справа на лево бежит надпись " ВАЗ-21099 БРАt " smile 

Проблема: 
Тахометр работает нормально, а вот отображение ADC smile  Питаю от +12 вольт схему - тогда индикатор отображает нормально нормально - 11.93в. Когда включаю в  +5в.(BODEN BODLEVEL отключил чтоб нормаль было) показывает +7.89в.  Вообщем бред smile 

Кто хорошо знаком с ADC в MEGA8 и кто пишет на Cи-подобных языках просьба помочь smile 

ИТАК!!! smile    Ниже приводиться схема общяя и конкретно входного каскада ADC.
Описание: Схема не полная (только для того чтоб в протеусе отладить). Входной каскад ADC как в реальности соответствует!!!  

Мои соображения!!! Неправильный входной каскад. и косяки в программе. Кому надо дам файлы протеуса и всё что нужно

Да и ещё порт канала ADC в программе как вход с логическим нулём. smile 

user posted image

user posted image

Код


// MEGA8

#include <avr/io.h>  
#include <avr/interrupt.h> 
#include <util/delay.h> 
#include <stdlib.h>
#include <math.h>
#include <inttypes.h>
#include<avr/sleep.h>
#include <avr/eeprom.h>


#define digit1 PC0      //анод первой цифры 
#define digit2 PC1      //анод второй цифры 
#define digit3 PC2      //анод третей цифры 
#define digit4 PC3      //анод четвёртой цифры 
#define VREF 5000 //11.91V
#define leds PD3
#define lcd PD4
#define regim PD0
#define e_regim 0 //Адреса для сохранения значений
#define e_power 1
#define e_tahom 2

/*
char digits[] = {           // массив с цифрами для протеуса, ну там анод катод и т.д.
0b11000000,    // 0 
0b11111001,    // 1 
0b10100100,    // 2 
0b10110000,    // 3 
0b10011001,    // 4 
0b10010010,    // 5 
0b10000010,    // 6 
0b11111000,    // 7 
0b10000000,    // 8 
0b10010000,    // 9 
0b10111111,    // - 10 
0b11111111,    // пустота
0b01111111,    // . 12
0b11000010,    // G 13
0b01111001,    // ! 14
0b10000010,    // Б 15
0b10001100,    // Р 16
0b10001000,    // А 17
0b10000111     // t 18
};    


char digits_Volt[] = {      // массив с цифрами(с точкой) 
0b01000000,    //0 
0b01111001,    //1 
0b00100100,    //2 
0b00110000,    //3 
0b00011001,    //4 
0b00010010,    //5 
0b00000010,    //6 
0b01111000,    //7 
0b00000000,    //8 
0b00010000,    //9 
0b00111111,    //знак минуса 
0b01111111,    //пустота
0b01111111     //разделительная точка
};            
*/


char digits[] = {           // массив с цифрами (для реальной схемы)
0b00111111,    // 0 
0b00000110,    // 1 
0b01011011,    // 2 
0b01001111,    // 3 
0b01100110,    // 4 
0b01101101,    // 5 
0b01111101,    // 6 
0b00000111,    // 7 
0b01111111,    // 8 
0b01101111,    // 9 
0b01000000,    // - 10 
0b00000000,    // пустота
0b10000000,    // . 12
0b00111101,    // G 13
0b10000110,    // ! 14
0b01111101,    // Б 15
0b01110011,    // Р 16
0b01110111,    // А 17
0b01111000     // t 18
}; 

char digits_Volt[] = {      // массив с цифрами(с точкой) 
0b10111111,    //0 
0b10000110,    //1 
0b11011011,    //2 
0b11001111,    //3 
0b11100110,    //4 
0b11101101,    //5 
0b11111101,    //6 
0b10000111,    //7 
0b11111111,    //8 
0b11101111,    //9 
0b11000000,    //знак минуса 
0b10000000,    //пустота
0b10000000     //разделительная точка
};     

volatile unsigned char digit_out[4],cur_dig, count_dostup=1,displ_regim,dig_N, dig_V; //переменные для работы с LED 
volatile unsigned int indication,tmp_ind,period,zamer[8],zamer_cnt=0,ticks,ticks_sredn,a;
volatile unsigned long volt;
volatile unsigned int key_time,temp2,temp,blink,adc;
volatile unsigned char power=1,hide_show=1,tempL,tempL2,zastavka=1,cuts=0,key_old,keypr,keyn,key_ch;
volatile unsigned char key_count,vis=1,vis2=1, key_pr,key_tim, a2dCompleteFlag;
volatile uint8_t  r_regim, r_power, r_tahom, displ_vis=1,led_vis=1;
 
//******************************************************************************************
//   Function Name : init_adc
//   Title         : Initialize A/D-Converter
//******************************************************************************************
void  init_adc(){
  //  ADMUX = (1<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(0<<MUX0); 

    //ADCSRA =(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    
      // АЦП разрядность 10 бит // Опорное напряжение с вывода 20 AVCC
  // Вход АЦП вывод 27 PC4
  ADMUX &= 0xDF & 0x7F & 0xF4; ADMUX |= 0x40 | 0x04; 
  // Включить АЦП постоянное измерение, Fацп=(8000/64)=125кГц
 // ADCSRA &= 0xFE; ADCSRA |= 0x80 | 0x40 | 0x20 | 0x06;
  
    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // set ADC prescaler to , 1MHz / 8 = 125kHz    
}


//******************************************************************************************
//   Function Name : get_adc
//   Title         : Get A/D-Converter-data
//******************************************************************************************
 int ADC_read(void){
    char i;
    int ADC_temp;
    int ADC_var = 0;
    
    // To save power, the voltage over the LDR and the NTC is turned off when not used
    // This is done by controlling the voltage from a I/O-pin (PORTF3)
    

    sbi(ADCSRA, ADEN);     // Enable the ADC

    //do a dummy readout first
    ADCSRA |= (1<<ADSC);        // do single conversion
    while(!(ADCSRA & 0x10));    // wait for conversion done, ADIF flag active
        
    for(i=0;i<8;i++)            // do the ADC conversion 8 times for better accuracy 
    {
        ADCSRA |= (1<<ADSC);        // do single conversion
        while(!(ADCSRA & 0x10));    // wait for conversion done, ADIF flag active
        
        ADC_temp = ADCL;            // read out ADCL register
        ADC_temp += (ADCH << 8);    // read out ADCH register        

        ADC_var += ADC_temp;      // accumulate result (8 samples) for later averaging
    }

    ADC_var = ADC_var >> 3;     // average the 8 samples
        
   
    cbi(ADCSRA, ADEN);      // disable the ADC

    return ADC_var;
}
volatile uint8_t key (volatile uint8_t s){ 
   if (!(_SFR_BYTE(PIND) & _BV(s)))  // (bit_is_clear(PIND,s))//Если было нажатие 
  { _delay_loop_2(100);
      if (!(_SFR_BYTE(PIND) & _BV(s)))// Если кнопку ещё не отпустили
    {return (0);}
  }
  return (1);
}
void check_keys(){
    if ((key(regim)) == 0 ) {key_pr=3;}
    if ((key(regim)) == 1 ) {if (key_pr==3){
    if(++key_tim==15){key_tim=0;key_pr=0;if (displ_regim==1)
    {displ_regim=0; eeprom_write_byte((uint8_t*)0,0);}
     else
    {displ_regim=1; eeprom_write_byte((uint8_t*)0,1); }; }; } }
    
    if ((key(lcd)) == 0 ) {key_pr=2;}
    if ((key(lcd)) == 1 ) {if (key_pr==2){
    if(++key_tim==15){key_tim=0;key_pr=0;if(displ_vis==1)
                      {displ_vis=0;eeprom_write_byte((uint8_t*)1,0);}
                       else
                      { displ_vis=1; eeprom_write_byte((uint8_t*)1,1); };
                      if(displ_vis==0){PORTC &= ~_BV(digit1);PORTC &= ~_BV(digit2);PORTC &= ~_BV(digit3);PORTC &= ~_BV(digit4);};};}}
                        
    if ((key(leds)) == 0 ) {key_pr=1;}
    if ((key(leds)) == 1 ) {if (key_pr==1){
    if(++key_tim==15){key_tim=0;key_pr=0;
                      if(led_vis==1)
                      {led_vis=0;eeprom_write_byte((uint8_t*)2,0);}
                       else
                      {led_vis=1;eeprom_write_byte((uint8_t*)2,1); };
                      if(led_vis==0){PORTD&=~_BV(PD5);PORTD&=~_BV(PD6);PORTD&=~_BV(PD7);};};}}                        
}

void display_tahometr() {
 if (cur_dig==0) {PORTC &= ~_BV(digit4); PORTB=0x00;PORTC |=_BV(digit1); PORTB=(digits  [digit_out[cur_dig]]);};

 if (cur_dig==1) {PORTC &= ~_BV(digit1); PORTB=0x00;PORTC |=_BV(digit2); PORTB=(digits  [digit_out[cur_dig]]);};

 if (cur_dig==2) {PORTC &= ~_BV(digit2); PORTB=0x00;PORTC |=_BV(digit3); PORTB=(digits  [digit_out[cur_dig]]);};

 if (cur_dig==3) {PORTC &= ~_BV(digit3); PORTB=0x00;PORTC |=_BV(digit4); PORTB=(digits  [digit_out[cur_dig]]);};
                   
                   
                   
     cur_dig++;                           //увеличиваем cur_dig на 1 
  if (cur_dig==4) cur_dig=0; 
  }

void display_voltmetr() {
  if (cur_dig==0) {PORTC &= ~_BV(digit4); PORTB=0x00;PORTC |=_BV(digit1); PORTB=(digits  [digit_out[cur_dig]]);};  //подаём питание на разряд 4 
  if (cur_dig==1) {PORTC &= ~_BV(digit1); PORTB=0x00;PORTC |=_BV(digit2); PORTB=(digits  [digit_out[cur_dig]]);};  //подаём питание на разряд 3 
  if (cur_dig==2) {PORTC &= ~_BV(digit2); PORTB=0x00;PORTC |=_BV(digit3); PORTB=(digits_Volt [digit_out[cur_dig]]) ;};
  if (cur_dig==3) {PORTC &= ~_BV(digit3); PORTB=0x00;PORTC |=_BV(digit4); PORTB=(digits  [digit_out[cur_dig]]);};  //подаём питание на разряд 1 

     cur_dig++;                           //увеличиваем cur_dig на 1 
  if (cur_dig==4) cur_dig=0; 
  }
void init_cpu (void){       // Насторойка портов

PORTB=0xFF; 
DDRB=0xFF; 

DDRC= 0b10110111;
PORTC=0b00000000; 
 

PORTD=0b00011001; 
DDRD =0b11100010; 

//TCCR0 = 0x03; // Делитель тактовой частоты на 64
MCUCR = 0b01010011; //0x02;
GICR  = 0b01000000;
SREG=0x80;   
//SREG=0b10000000;   

//Таймер 0 overflow 
TIMSK |= _BV(TOV0);//(TOV0);  //(TOV0);   //разрешаем таймер по переполнению
TCNT0=0;            // Обнуляем значение таймера
TCCR0 = 0b00000001;   //_BV(CS00);   // Запускаем таймер без делителя // 4MHz

init_adc();

  sei();
}


void recoding(void) {       //функция вывода на дисплей и перекодировки из hex в dec 
   if (indication=="C") {       //если переменная равна "E" 
      digit_out[0]=11;digit_out[1]=11;digit_out[2]=11;digit_out[3]=11; //выводим  на экран надпись "БРАТ" 
   } else {        

       digit_out[0]=indication%10;   // Делим на 10 остаток в масив 1-разряд        *** 1989%10 = 198,9
          indication=indication/10;     // Оставляем 3 разряда                    === 1989/10 = 198
       digit_out[1]=(indication%10); //|(0b01111111) ;   // Делим на 10 остаток в масив 2-разряд    
          indication=(indication/10) ;     // Оставляем 2 разряда                   *** 1989/10 = 19
       digit_out[2]=indication%10;   // Делим на 10 целое число в масив 3-разряд   ***  19%10  = 9 
          indication=indication/10;
       digit_out[3]=indication%10;
 }
}   
    


ISR(INT0_vect){    //Прерывание импульсами от генератора автомобиля

  if (count_dostup==1) // Если подсчёт разрешен
  {
    //TCCR0 = 0;    // останавливаем счетчик 0
    TCCR1B = 0; // stop timer1
        
    zamer_cnt++;
      
        tempL = TCNT1L;
        temp  = TCNT1H;
        temp  = (temp << 8);
        temp += tempL;
    
    switch(zamer_cnt) // 8 раз считываем импульсы между прерываниями
    {
     case 1:{zamer[1]=temp;break;};    
     case 2:{zamer[2]=temp;break;};    
     case 3:{zamer[3]=temp;break;};    
     case 4:{zamer[4]=temp;break;};    
     case 5:{zamer[5]=temp;break;};    
     case 6:{zamer[6]=temp;break;};    
     case 7:{zamer[7]=temp;break;};    
     case 8:{zamer[8]=temp;break;};    
    }
    if (zamer_cnt==8){
        ticks_sredn = ((zamer[1]+zamer[2]+zamer[3]+zamer[4]+zamer[5]+zamer[6]+zamer[7]+zamer[8]) /8);
        zamer_cnt=1; tmp_ind=temp;};
        
        // 1000-468 // 2000-234 // 3000-155 // 4000-116 // 5000-93 // 8000-58
        
        //tmp_ind=(379000/ticks_sredn);
        //tmp_ind=ticks_sredn;
        
         if (ticks_sredn>411)                                {tmp_ind=(402000/ticks_sredn);} //1000 33.33Гц
         else if ((ticks_sredn<=411) && (ticks_sredn>205)) {tmp_ind=(405000/ticks_sredn);} //2000 66.6Гц
         else if ((ticks_sredn<=205) && (ticks_sredn>134)) {tmp_ind=(385000/ticks_sredn);} //3000 100Гц
         else if ((ticks_sredn<=134) && (ticks_sredn>100)) {tmp_ind= (375000/ticks_sredn);}//4000 133.3Гц
         else if ((ticks_sredn<=100) && (ticks_sredn>80))  {tmp_ind= (364000/ticks_sredn);}//5000 166.6Гц
         else if ((ticks_sredn<=80)  && (ticks_sredn>50))  {tmp_ind=(350000/ticks_sredn);}//8000 266,6Гц
         else if (ticks_sredn<=50)  {tmp_ind=(300000/ticks_sredn);};   //8000 266,6Гц
        // else if (ticks_sredn<=50){tmp_ind=8000;}; 
        
        
      TCNT1H = 0; // clear timer1 counter
      TCNT1L = 0;
      TCCR1B = 0b00000011;     // start timer1 with no prescaling
  }   
  
  
}

ISR(TIMER0_OVF_vect){   
  if(zastavka==1){
    if (indication==1) {digit_out[0]=11;digit_out[1]=11;digit_out[2]=11;digit_out[3]=11;};
    if (indication==2) {digit_out[0]=8; digit_out[1]=11; digit_out[2]=11;digit_out[3]=11;};
    if (indication==3) {digit_out[0]=17;digit_out[1]=8; digit_out[2]=11;digit_out[3]=11;};  
    if (indication==4) {digit_out[0]=3; digit_out[1]=17;digit_out[2]=8; digit_out[3]=11;};  
    if (indication==5) {digit_out[0]=10;digit_out[1]=3; digit_out[2]=17;digit_out[3]=8; };
    if (indication==6) {digit_out[0]=2; digit_out[1]=10; digit_out[2]=3;digit_out[3]=17; };
    if (indication==7) {digit_out[0]=1;digit_out[1]=2; digit_out[2]=10;digit_out[3]=3; };
    if (indication==8) {digit_out[0]=0;digit_out[1]=1; digit_out[2]=2;digit_out[3]=10; };
    if (indication==9) {digit_out[0]=9;digit_out[1]=0; digit_out[2]=1;digit_out[3]=2; };
    if (indication==10){digit_out[0]=9;digit_out[1]=9; digit_out[2]=0;digit_out[3]=1; };
    if (indication==11){digit_out[0]=11;digit_out[1]=9; digit_out[2]=9;digit_out[3]=0; };
    if (indication==12) {digit_out[0]=15;digit_out[1]=11; digit_out[2]=9;digit_out[3]=9; };
    if (indication==13) {digit_out[0]=16;digit_out[1]=15; digit_out[2]=11;digit_out[3]=9; };
    if (indication==14) {digit_out[0]=17;digit_out[1]=16; digit_out[2]=15;digit_out[3]=11;};
    if (indication==15) {digit_out[0]=18;digit_out[1]=17; digit_out[2]=16;digit_out[3]=15;};
    if (indication==16) {digit_out[0]=18;digit_out[1]=17; digit_out[2]=16;digit_out[3]=15;};
    if (indication==17) {digit_out[0]=11;digit_out[1]=11; digit_out[2]=11;digit_out[3]=11;};
    if (indication==18) {zastavka=0;};
    

  if (cur_dig==0) {PORTC &= ~_BV(digit4); PORTC &= ~_BV(digit3);PORTC &= ~_BV(digit2);  PORTB=0x00;PORTC |=_BV(digit1); PORTB=(digits  [digit_out[cur_dig]]);_delay_loop_2(1000);}; 
  if (cur_dig==1) {PORTC &= ~_BV(digit1); PORTC &= ~_BV(digit3);PORTC &= ~_BV(digit4);  PORTB=0x00;PORTC |=_BV(digit2); PORTB=(digits  [digit_out[cur_dig]]);_delay_loop_2(1000);};  
  if (cur_dig==2) {PORTC &= ~_BV(digit1); PORTC &= ~_BV(digit2);PORTC &= ~_BV(digit4);  PORTB=0x00;PORTC |=_BV(digit3); PORTB=(digits  [digit_out[cur_dig]]);_delay_loop_2(1000);};
  if (cur_dig==3) {PORTC &= ~_BV(digit3); PORTC &= ~_BV(digit2);PORTC &= ~_BV(digit1);  PORTB=0x00;PORTC |=_BV(digit4); PORTB=(digits  [digit_out[cur_dig]]);_delay_loop_2(1000);};  
    
  if (cur_dig==10){cur_dig=0; }else{ cur_dig++;};

 
    }else{TIMSK=0;TCNT0=0;TCCR0=0;TCNT1L=0;TCNT1H=0;tmp_ind=0;indication=0;zastavka=0;};
    
    
} 

void show_zastavka(void){
       // _delay_loop_2(50); 
     while(cuts!=18){
        _delay_loop_2(50); 
        cuts++;
        tmp_ind=cuts; 
        indication=tmp_ind; //600    
     }
}





void EEPROM_read_val(void){
  displ_regim = eeprom_read_byte((uint8_t*)e_regim);
    displ_vis = eeprom_read_byte((uint8_t*)e_power);
      led_vis = eeprom_read_byte((uint8_t*)e_tahom);
}


//****************************************************************//
//=================== Основная программа==========================//
//****************************************************************//
int main(void) 
{ 

  init_cpu();
   EEPROM_read_val(); //Загружаем настройки из EEPROM
     PORTC&=~_BV(PC4);
 indication="C"; 
 recoding();
 show_zastavka();
 sei();

for (;;)  //Основной цикл
{   

    check_keys();
  
    volt= ADC_read() ; 
    volt = (volt*5000/200);    // Вычисляем входное напряжение в милливольтах 11.92v 
    
        if (volt>1400){PORTD|=_BV(PD1);}else{PORTD&=~_BV(PD1);};
        if (volt<1100){PORTC|=_BV(PC5);}else{PORTC&=~_BV(PC5);};
                {   // счётчик оборотов / Защита от переполнения 
                 tempL2 = TCNT1L;
                 temp2  = TCNT1H;
                 temp2  = (temp2 << 8);
                 temp2 += tempL2;
                   if (temp2>5000)
                   {
                    TCNT1H = 0; 
                    TCNT1L = 0;
                    TCCR1B = 0;
                    tmp_ind=0; //светим НОЛЬ
                   }
               
               if (led_vis==1)// Если режим 2 или 3
                 {
                         if (tmp_ind<100)                     {PORTD&=~_BV(PD7); PORTD&=~_BV(PD6); PORTD&=~_BV(PD5);}
                    else if ((tmp_ind<2500)    && (tmp_ind>0))   {PORTD|=_BV(PD7);  PORTD&=~_BV(PD6); PORTD&=~_BV(PD5);}
                    else if ((tmp_ind>4500) && (tmp_ind<6000)){PORTD|=_BV(PD7);  PORTD|=_BV(PD6);  PORTD&=~_BV(PD5);}
                    else if (tmp_ind>6000)                     {PORTD|=_BV(PD7);  PORTD|=_BV(PD6);  PORTD|=_BV(PD5);}
                 }else{PORTD&=~_BV(PD5);PORTD&=~_BV(PD6);PORTD&=~_BV(PD7);};        
               
                if ((displ_regim==1)&&(displ_vis==1)) // Если режим 1 или 3
                  { 
                    display_tahometr();
                    indication=tmp_ind; 
                    recoding();
                  }; 
                };
            
            
            if ((displ_regim==0)&&(displ_vis==1))// Режим дисплея - Вольтметр
            { 
             display_voltmetr();
             indication=volt; 
             recoding();
            };
        
        
        
     }
        

 

}


PM MAIL   Вверх
PILOT
Дата 24.9.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



а почему конденсатор 1милифарад? там постоянная времени будет около 1секунды... зачем?
зачем нужен амперметр на входе АЦП у которого внутреннее сопротивление Мегомы?
откуда берутся +5В?
Зачем в плече делителя три резистора параллельно?

задавать дальше вопросы?

СУВ.



--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
kaspersky89
Дата 24.9.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



PILOT  Чтоб ты не думал что я сощёл сума когда собирал схему отвечу попорядку.


а почему конденсатор 1милифарад? там постоянная времени будет около 1секунды... зачем?Ёмкость конденсатора не имеет значения, в Proteus-е да и на практике разницы никакой. Можно его даже убрать, но кашу как говориться маслом не испортить.

зачем нужен амперметр на входе АЦП у которого внутреннее сопротивление Мегомы?
Амперметр с вольтметром на входе только для отладки, в жизни их нет

откуда берутся +5В?Вот и я думаю откуда их взять? smile  В моём варианте программы и схемы их достать неплучается.

Зачем в плече делителя три резистора параллельно?
Из практики. Программно нога ADC канала на земле. Чтобы получить +5В я уменьшал сопротивление во входной цепи, тоесть вместо 3-х стоял 1 на 100 ом. При этом было +5В. как и надо, но ток 100мА и жутко грелся резистор, что долго AVR не выдержал бы. В результате компромисс, три резистора(чип)чтоб ток больший пропускали и не грелись. Вообщем кто захочет поймёт. smile  Вроде разжевал мелче некуда smile 

задавать дальше вопросы?
Лучше если есть опыт по данному вопросу, то поделись схемой и исходником. smile  Я не хочу долго спорить и нести всякий бред. Я и сам знаю что часть схемы и программы у меня сделаны неверно. smile 
PM MAIL   Вверх
kaspersky89
Дата 24.9.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Я только непонимаю, зачем было делать форум если на нём нет никакой реальной помощи, а только плевки с высоты своего профессианализма smile  smile  smile  smile .
PM MAIL   Вверх
kaspersky89
Дата 24.9.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Ну чтож, великие гуру от программинга и электроники. Чтоб не скучно никому небыло, ниже архив, внутри него исходник на WinAvr а также файл проекта программы Proteus. Попробуйте запустить, и посмотрите напряжение на резисторном делителе. Кстати факт без подключения делителя к контроллеру, напряжение делиться нормально, иначе оно падает почти до нуля. Подскажите где я ступил(скорей всего в программном коде)

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Tahometr.rar 48,82 Kb
PM MAIL   Вверх
kaspersky89
Дата 24.9.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Попробуйте после делителя получить +5в

В архиве исходник с протеус проектом

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  Tahometr.rar 48,82 Kb
PM MAIL   Вверх
Mazzi
Дата 25.9.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Резисторный делитель на входе АЦП делит напряжение примерно на 2, поэтому при подаче туда 12 вольт, с делителя будет сниматься 6 вольт. В автомобиле напряжение реально может повышаться во время работы двигателя вольт эдак до 15-16, вот и делайте выводы.
При этом по даташиту на входы нельзя подавать напряжение превышающее напряжение питания более чем на пол вольта.

Разберись сначала с этим.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 25.9.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Mazzi  Ну ты совсем меня обижаешь. smile    Я уже сколько электроникой занимаюсь. Думаешь я не менял номиналы входной цепи с учётом того что напряжение в тачке может достигать +20в?  Повторяю без подключения к МК делиться нормально, значит входная цепь ОК. Так что косяки в программе, полюбому smile

Добавлено через 2 минуты и 59 секунд
Mazzi Если у тебя стоит Proteus7.2 или другой версии скачай архив и попробуй. Увидишь на вольтметре напряжение в десятые доли вольта. А потом попробуй удалить проводник делителя до МК и увидишь что там как и надо половина напряжения. smile  smile

Добавлено через 5 минут и 38 секунд
Покупать чтото вроде (AD XXXX) нехочу, деньги не столь важны, просто перепаивать и делать новую плату небуду, так как дел у меня немало. smile 
PM MAIL   Вверх
kaspersky89
Дата 25.9.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Если лень кому совсем смотреть программу и скачивать архив, то хотябы посоветуйте микросхему АЦП фирмы Analog devicec c восьмибитным преобразованием. Чем дешевле , тем лучше,  чтоб выдерживала +20в
PM MAIL   Вверх
Mazzi
Дата 25.9.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



kaspersky89,  я же не знаю твоей квалификации, просто пытаюсь помочь, так что не обижайся.

Попробуй напряжение на входе менять, и посмотри, что твой прибор показывает, ошибка во всём диапазоне или только на верхнем участке? Может у АЦП не хватает разрешения, то есть сигнал больше, чем может он измерить?

Протеуса у меня нет, както без него обхожусь. Хотя когда нибудь психану и поставлю себе.

Добавлено через 5 минут и 57 секунд
Цитата(kaspersky89 @ 25.9.2008,  12:33)
Если лень кому совсем смотреть программу и скачивать архив, то хотябы посоветуйте микросхему АЦП фирмы Analog devicec c восьмибитным преобразованием. Чем дешевле , тем лучше,  чтоб выдерживала +20в

Напиши сколько у тебя в контроллере свободных дискретных выводов, я тебе посоветую дешёвый самодельный АЦП.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 25.9.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Mazzi
Напиши сколько у тебя в контроллере свободных дискретных выводов, я тебе посоветую дешёвый самодельный АЦП.
При доработке программы и доработки схемы. Выыодов 6 должно освободиться.

Попробуй напряжение на входе менять, и посмотри, что твой прибор показывает, ошибка во всём диапазоне или только на верхнем участке? Может у АЦП не хватает разрешения, то есть сигнал больше, чем может он измерить?
Не с АЦП нормально, Разрешения 10-бит у MEGA8 хватает. 
Насчёт ошибки измерения на 1в ошибка примерно 0.36в   , это уж слишком. 
PM MAIL   Вверх
Mazzi
Дата 25.9.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(kaspersky89 @ 25.9.2008,  12:55)



>>> Не с АЦП нормально, Разрешения 10-бит у MEGA8 хватает. 

По даташиту верных разрядов только 8, два младших разряда можно отбросить.

>>>При доработке программы и доработки схемы. Выыодов 6 должно освободиться.
 
Во вложении схема простого в реализации АЦП, резисторы нужно брать однопроцентные, ключи можно брать например 561КТ3, либо буржуйский аналог 4066.

Разрядность можно сделать реально 16 разрядную, выше не стоит. Если стабилитрон неполярный(сдвоенный), то параллельно ему нужно поставить диод анодом на землю.
Операционник любой.

Хотя конечно, я бы добивался правильной работы АЦП на борту контроллера.

Добавлено через 2 минуты и 13 секунд
Да, забыл, любой последовательный регистр, с нужной разрядностью.

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  ____000.jpg 50,30 Kb


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 25.9.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Mazzi   Как я понял на твоей схеме. Тот же самый делитель напряжения и так скажем буфер обмена в виде операционника? smile 

Идея действительно проста как всё гениальное  smile 

Непонял правдо зачем там переключения всякие и 561КТ3 smile 

Вообщем поставлю операционник 8pin-овый место много не займёт.

Спасибо за идею!!!

Добавлено через 3 минуты и 46 секунд
А в программе +5в буду как бы +20в от автомобиля, тоесть при +12в на входе на контроллер будет идти +2.7в.  Вообщем идея такова smile 
PM MAIL   Вверх
Mazzi
Дата 25.9.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



kaspersky89, на самом деле на рисунке схема стандартного АЦП, для работы с которым достаточно трёх дискретных выводов контроллера. 
(наверное ты просто пошутил, не мог же ты не понять этого) smile 


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 25.9.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Mazzi на самом деле на рисунке схема стандартного АЦП, для работы с которым достаточно трёх дискретных выводов контроллера. 
(наверное ты просто пошутил, не мог же ты не понять этого) smile  

Если честно то недопонял логику работы схемы. smile 

Сегодня попробую вариант как на схеме ниже(наброски просто). Proteus сначала помучаю. После экспирементов отпишусь в форум.

user posted image
PM MAIL   Вверх
Alexei
Дата 25.9.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 20.8.2003

Репутация: 4
Всего: 4



2 kaspersky89 Нарисовали бы вы схемкуреально, а не в дурацском протеусе.
Мне не понятно, чем вы питаете АВР? Стоит ли стабилитрон или мс стабилизатора?
АЦПшный вход надо защищать так:
после делителя включить два диода шоттки , один анодом к земле катодом к пину , второй анодом к пину , катодом к питанию +5в.
PM MAIL   Вверх
kaspersky89
Дата 25.9.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Alexei По вашей просьбе привожу схему нарисованную подробней в Eagl .  Печатку рисовал в Sprint layout.

Насчёт защиты и повышения надёжности вопрос не стоял, для начала надо добиться результата а потом его улучшать.

P.S. Как я и ожидал моя идея включения операционника в цепь оказалась полным бредом.  Всётаки косяк в программе.


PM MAIL   Вверх
Alexei
Дата 26.9.2008, 09:48 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 20.8.2003

Репутация: 4
Всего: 4



Цитата(kaspersky89 @  25.9.2008,  19:54 Найти цитируемый пост)
По вашей просьбе привожу схему нарисованную подробней в Eagl .

Что-то не вижу.  smile 

Цитата(kaspersky89 @  25.9.2008,  19:54 Найти цитируемый пост)
моя идея включения операционника в цепь оказалась полным бредом

Так как у вас нарисовано , опер будет сильно усиливать, очень сильно. smile
Инвертирующий вывод (-) присоедените на выход опера, получите повторитель. Хотя он там и нафиг не нужен.
Цитата(kaspersky89 @  25.9.2008,  19:54 Найти цитируемый пост)
Насчёт защиты и повышения надёжности вопрос не стоял

Был разговор как защитить от если вместо 12в появится 20.
PM MAIL   Вверх
Mazzi
Дата 26.9.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Прошу меня простить, первая схема из-за спешки нарисована неверно, поистине "поспешишь, людей насмешишь". Выкладываю правильную схему.

Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  ____000.jpg 67,75 Kb


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 26.9.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Alexei Что-то не вижу.  smile 

Извини просто провайдер мой достал окончательно, жаль тут выражаться нельзя, сволочи, рекламы выше крыши а сервис всё тотже совковый  smile  Скорей поседеть можно чем дождаться коннекта. smile 

Вторая ваша цитата насчёт операционника имеет место быть. smile  Идея с моим вариантом в топку  smile 

Насчёт защиты от скачков напряжения, вроде как все уже с пелёнок знают, что это как зубы почистить, как водителю при покидании машины(ВАЗ, ГАЗ и прочего хлама smile ) поставить её на передачу. smile 

Mazzi Спасибо за схему, обязательно возьму на заметку. Только ситуация такова что корпус у меня очень мал, от китайских (взял за 50р.)часов в прямоугольном маленьком корпусе. Я и так проявил чудеса компоновки чтобы всё вместилось. 
  Да и с другой стороны, всётаки хочется чтобы, правильно работало, тоесть устранить саму причину неисправности, а не придумывать какието компромисы. smile 

Как обещал снизу картинка
user posted image

Добавлено через 10 минут и 51 секунду
В схеме ничего сверхъестественного.  

Господа, как я и говорил при таком минимуме деталей, ошибки в схеме врядли могут быть smile 

Если кто программил на WinAvr и прочих С-подобных для AVR. То только вы сможете помочь. Может я где порты не так настроил. Может с регистрами ADMUX и ADCSRA напутал.? smile 
PM MAIL   Вверх
Mazzi
Дата 26.9.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Вот рекомендации производителя по подключению питания к АЦП встроенному в ATMega8(см.вложенный файл). Обратите внимание на показанный пунктиром контур экранирующей площадки.

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  sch1.GIF 11,12 Kb


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kaspersky89
Дата 26.9.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Mazzi Я же говору, эти знания они уже с пелёнок. smile   Вопрос не стоит в помехах, если учесть что глюки и с батарейкой на коротких проводниках, то извините КАКИЕ ТУТ НАФИГ НАВОДКИ!!! smile 

Ещё раз повторюсь. Господа вам самим не надоело, тыкать меня носом в схему? smile  Ведь проблема в программе однозначно! smile  smile 
PM MAIL   Вверх
kaspersky89
Дата 27.9.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Эй мужики!!! Вы чего!!! Вроде столько умных людей на форуме, и ветка называется программирование контроллеров. А такую хрень как АЦП некто додумать неможет.

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

Ладно, заранее всем спасибо за посильно оказанную помощь. Может в интернет нескоро выйду. Осталось на карте минут 15 всего.

Если у кого стоит Proteus скачайте архив и посмотрите на вольтметр в симуляции.  Если нет, то пусть тогда модераторы закрывают ветку эту нах... .

P.S. Отдельная благодарность Mazzi за его схему АЦП.
PM MAIL   Вверх
kaspersky89
Дата 27.9.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Ну чтож господа можете меня поздравить с успехом  smile  Решил проблему сам, как и думал косяк в программе. Заменил пару строчек настройки порта, немного входную цепь делителя. smile 
Код

PORTC=0b00000000;  
DDRC= 0b00000000;


Теперь осталось по мелочи, подстроить программный делитель значения с АЦП преобразования(чтоб отображалось точно на дисплее), ну и частоту обновления дисплея чтоб яркость в норме была. smile  smile  smile 

P.S. Жаль конечно что не смогли помочь вы(гуру по электронике), я то думал тут обитают опытные профессионалы по программированию. smile 

Ещё раз спасибо Mazzi за потраченное время. smile 


PM MAIL   Вверх
kaspersky89
Дата 27.9.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



 smile  !!!ОКОНЧАНИЕ ПРОЕКТА!!! smile 

Вольтметр.
При +20в на вход АЦП поступает 2,35в  ,  что соответсвует безопасности входа АЦП и его допускам
В диапазоне от +5в до +20в погрешность составляет +0.03в (большей точности и не надо) smile 
При выходе за пределы  < +11,5в....> +14,5в  загораются синий или красный светодиод соответственно

Тахометр.
В режиме отображения Тахометр. допуск 300об/мин --- 8000об/мин (по отображению на дисплее учтены большая часть условий которая может возникнуть от момента подачи питания от замка зажигания до движения и момента глушения двигателя)
Три светодиода тахометра загараются на разной частоте оборотов коленвала

Кнопки
Включение/выключение дисплея и смена отображения режима тахометр/вольтметр, управляются с помощью кнопок, все изменения заносятся в EEPROM  и загружаются при подаче питания
Кнопки срабатывают на отпускание(отжатие)

постскриптум
Ниже в архиве часть схемы(картинка симуляции в Proteus)  а также исходный код(недописан код немного - мерцание дисплея, но кому надо допишут сами, самому щас неохота, устал, поздно уже 23.00 ).

Проект считаю полностью завершённым на данном этапе.(Остался корпс и косметический ремонт программы)

P.S.  Моё мнение почему никто не смог помочь,   это то что здесь на форуме просто бывалые технари привыкшие колдовать со стрелочным вольтметром, и древним ламповым осцилографом. smile   
    Но проснитесь господа радиолюбители!!! 21 век!!! Сейчас дела решаются не с помощью паяльника в 70Ватт и какойто матери, а с помощью контроллеров  и  С++ .  smile 



Присоединённый файл ( Кол-во скачиваний: 37 )
Присоединённый файл  Tahometr.rar 58,76 Kb
PM MAIL   Вверх
Mazzi
Дата 29.9.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Рад за тебя. smile 


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
SarCity
Дата 1.6.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



2 kaspersky89
Поделитесь пожалуйста окончательным вариантом прошивки и схемы, последний ваш исходник не компилится.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1973 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.