Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

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


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

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

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


 




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


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

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