Обсуждаем контроллеры компании Atmel.
Ответить

Вопрос по ацп

Чт апр 25, 2019 21:59:15

Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет. Вопрос такой: как можно реализовать программный ацп? Желательно на си! Про точность понимаю, но высокая и не нужна. Пожалуйста, не надо предлагать взять другой чип или использовать внешний ацп!

Re: Вопрос по ацп

Чт апр 25, 2019 22:15:03

kot2004 писал(а):как можно реализовать программный ацп?
Как вариант - одним каналом ШИМ шимить сигнал с линейно меняющейся скважностью, отфильтровать его, и подать на один из входов встроенного аналогового компаратора. На второй вход компаратора подать измеряемое напряжение. При "срабатывании" компаратора из текущего значения скважности ШИМ вычислить напряжение. :roll:

Re: Вопрос по ацп

Чт апр 25, 2019 22:30:11

Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет.

У тини2313 есть аналоговый компаратор, вот на нём и организуй. :write: И ничего мудрить не придётся. :)

Re: Вопрос по ацп

Чт апр 25, 2019 23:42:47

Про аналоговый компаратор я знаю! А как это программно в си организовать? Можно небольшой пример кода?

Re: Вопрос по ацп

Пт апр 26, 2019 00:14:43

kot2004, причём тут Си ? Доку нужно курить на камушек в первую очередь.
Во вторых - нужно схемное решение. Оно есть у Вас ?
А язык - дело тридесятое. Если Вы так хорошо знаете Си, то написать программу, зная железо, не составит никакого труда ...

Re: Вопрос по ацп

Пт апр 26, 2019 06:40:56

Код:
if(comparator) svet= 1;
else svet= 0;

В чём проблема?

Re: Вопрос по ацп

Пт апр 26, 2019 08:20:23

А как это программно в си организовать? Можно небольшой пример кода?

На Си не могу… ещё не изучал его. Пишу на непопулярном АВ (Algorithm Builder)… :)

Re: Вопрос по ацп

Сб апр 27, 2019 13:33:50

Идея использования компаратора разжевана ДиХальтом - вот http://easyelectronics.ru/avr-uchebnyj- ... atora.html
Там даже уже тня2313 - единственное, ДиХальт там писал на асме.
Но асм с комментариями, так что ничего не стоит переписать на сях...

Re: Вопрос по ацп

Сб апр 27, 2019 17:40:47

Три строчки кода
Спойлер
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t a,f;

// Analog Comparator interrupt service routine
ISR(ANA_COMP_vect)
{
// Place your code here
f=1;
 ACSR |=(1<<ACI); 
   
}

int main()
{
// Declare your local variables here

// Crystal Oscillator division factor: 1

CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

// Input/Output Ports initialization
// Port A initialization
// Function: Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDRA2) | (0<<DDRA1) | (0<<DDRA0);
// State: Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port D initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=(0<<INT1) | (0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: On
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
// Interrupt on Falling Output Edge
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=(0<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (1<<ACIE) | (0<<ACIC) | (1<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: Off
// Digital input buffer on AIN1: Off
DIDR=(1<<AIN0D) | (1<<AIN1D);


// Global enable interrupts
sei();
f=0; a=0;
while (1)
      {
      // Place your code here
   OCR0A++;
   _delay_ms(10);
   
   if (f){
    a=OCR0A;
      f=0;
   }
      }
 return 0;     
     
}

ИзображениеНа частоте 1Мгц частота ШИМ 31кГц, двойной rc-фильтр иначе здорово шумит.

Re: Вопрос по ацп

Сб апр 27, 2019 21:21:20

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

Re: Вопрос по ацп

Чт май 02, 2019 04:05:52

если скорость не важна, но нужно поточней, то ШИМ + интегрирующая цепочка + компаратор, если точность не важна, но нужно побыстрее, то можно замерить время заряда конденсатора...
я пробовал примерно таким образом питание мерять - замерял время заряжания конденсатора, всё работает, но ТКС многих конденсаторов оставляет желать лучшего... (при изменении температуры показания плывут)

Re: Вопрос по ацп

Чт май 02, 2019 09:51:14

Ivanoff-iv, тут еще хуже.
Кроме ТКЕ (не ТКС) конденсатора, тут еще есть засада в том, что при изменении температуры хорошо так гуляет и опорник внутри меги/тиньки.
А еще и частота встроенного "калиброванного" RC-генератора, если тактирование не от кварца.
Ответить