Страница 1 из 1

Вопрос по ацп

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

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

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

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

Добавлено: Чт апр 25, 2019 22:30:11
Самсусамыч
[uquote="kot2004",url="/forum/viewtopic.php?p=3623211#p3623211"]Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет.[/uquote]
У тини2313 есть аналоговый компаратор, вот на нём и организуй. :write: И ничего мудрить не придётся. :)

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

Добавлено: Чт апр 25, 2019 23:42:47
kot2004
Про аналоговый компаратор я знаю! А как это программно в си организовать? Можно небольшой пример кода?

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

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

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

Добавлено: Пт апр 26, 2019 06:40:56
pyzhman

Код: Выделить всё

if(comparator) svet= 1;
else svet= 0;
В чём проблема?

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

Добавлено: Пт апр 26, 2019 08:20:23
Самсусамыч
[uquote="kot2004",url="/forum/viewtopic.php?p=3623252#p3623252"]А как это программно в си организовать? Можно небольшой пример кода?[/uquote]
На Си не могу… ещё не изучал его. Пишу на непопулярном АВ (Algorithm Builder)… :)

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

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

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

Добавлено: Сб апр 27, 2019 17:40:47
Dimon456
Три строчки кода
Спойлер

Код: Выделить всё

#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
GoldenAndy
тут еще следует учесть, что компаратор в тиньке врядли рельс-ту-рельс... Соответственно, вблизи нля и вблизи питания могут быть нюансы...

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

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

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

Добавлено: Чт май 02, 2019 09:51:14
GoldenAndy
Ivanoff-iv, тут еще хуже.
Кроме ТКЕ (не ТКС) конденсатора, тут еще есть засада в том, что при изменении температуры хорошо так гуляет и опорник внутри меги/тиньки.
А еще и частота встроенного "калиброванного" RC-генератора, если тактирование не от кварца.