Вопрос по ацп

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 55
Зарегистрирован: Пн сен 11, 2017 10:49:54

Сообщение kot2004 »

Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет. Вопрос такой: как можно реализовать программный ацп? Желательно на си! Про точность понимаю, но высокая и не нужна. Пожалуйста, не надо предлагать взять другой чип или использовать внешний ацп!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

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

Сообщение Самсусамыч »

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

Сообщение kot2004 »

Про аналоговый компаратор я знаю! А как это программно в си организовать? Можно небольшой пример кода?
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

kot2004, причём тут Си ? Доку нужно курить на камушек в первую очередь.
Во вторых - нужно схемное решение. Оно есть у Вас ?
А язык - дело тридесятое. Если Вы так хорошо знаете Си, то написать программу, зная железо, не составит никакого труда ...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

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

if(comparator) svet= 1;
else svet= 0;
В чём проблема?
Docendo discimus
Контактная информация:
Реклама
Самсусамыч

Сообщение Самсусамыч »

[uquote="kot2004",url="/forum/viewtopic.php?p=3623252#p3623252"]А как это программно в си организовать? Можно небольшой пример кода?[/uquote]
На Си не могу… ещё не изучал его. Пишу на непопулярном АВ (Algorithm Builder)… :)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

Идея использования компаратора разжевана ДиХальтом - вот http://easyelectronics.ru/avr-uchebnyj- ... atora.html
Там даже уже тня2313 - единственное, ДиХальт там писал на асме.
Но асм с комментариями, так что ничего не стоит переписать на сях...
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение 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-фильтр иначе здорово шумит.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

тут еще следует учесть, что компаратор в тиньке врядли рельс-ту-рельс... Соответственно, вблизи нля и вблизи питания могут быть нюансы...
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

если скорость не важна, но нужно поточней, то ШИМ + интегрирующая цепочка + компаратор, если точность не важна, но нужно побыстрее, то можно замерить время заряда конденсатора...
я пробовал примерно таким образом питание мерять - замерял время заряжания конденсатора, всё работает, но ТКС многих конденсаторов оставляет желать лучшего... (при изменении температуры показания плывут)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

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

Вернуться в «AVR»