Вопрос по ацп
- Сообщения: 55
- Зарегистрирован: Пн сен 11, 2017 10:49:54
Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет. Вопрос такой: как можно реализовать программный ацп? Желательно на си! Про точность понимаю, но высокая и не нужна. Пожалуйста, не надо предлагать взять другой чип или использовать внешний ацп!
- Реклама
Как вариант - одним каналом ШИМ шимить сигнал с линейно меняющейся скважностью, отфильтровать его, и подать на один из входов встроенного аналогового компаратора. На второй вход компаратора подать измеряемое напряжение. При "срабатывании" компаратора из текущего значения скважности ШИМ вычислить напряжение.kot2004 писал(а):как можно реализовать программный ацп?
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. 
Всегда с уважением, Александр.
Всегда с уважением, Александр.
[uquote="kot2004",url="/forum/viewtopic.php?p=3623211#p3623211"]Здравствуйте! Имею чип attiny2313. Хочу сделать на нем датчик освещенности. Но встроенного ацп в attiny нет.[/uquote]
У тини2313 есть аналоговый компаратор, вот на нём и организуй.
И ничего мудрить не придётся. 
У тини2313 есть аналоговый компаратор, вот на нём и организуй.
- Сообщения: 55
- Зарегистрирован: Пн сен 11, 2017 10:49:54
Про аналоговый компаратор я знаю! А как это программно в си организовать? Можно небольшой пример кода?
kot2004, причём тут Си ? Доку нужно курить на камушек в первую очередь.
Во вторых - нужно схемное решение. Оно есть у Вас ?
А язык - дело тридесятое. Если Вы так хорошо знаете Си, то написать программу, зная железо, не составит никакого труда ...
Во вторых - нужно схемное решение. Оно есть у Вас ?
А язык - дело тридесятое. Если Вы так хорошо знаете Си, то написать программу, зная железо, не составит никакого труда ...
- Реклама
Код: Выделить всё
if(comparator) svet= 1;
else svet= 0;Docendo discimus
[uquote="kot2004",url="/forum/viewtopic.php?p=3623252#p3623252"]А как это программно в си организовать? Можно небольшой пример кода?[/uquote]
На Си не могу… ещё не изучал его. Пишу на непопулярном АВ (Algorithm Builder)…
На Си не могу… ещё не изучал его. Пишу на непопулярном АВ (Algorithm Builder)…
Идея использования компаратора разжевана ДиХальтом - вот http://easyelectronics.ru/avr-uchebnyj- ... atora.html
Там даже уже тня2313 - единственное, ДиХальт там писал на асме.
Но асм с комментариями, так что ничего не стоит переписать на сях...
Там даже уже тня2313 - единственное, ДиХальт там писал на асме.
Но асм с комментариями, так что ничего не стоит переписать на сях...
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Три строчки кода
На частоте 1Мгц частота ШИМ 31кГц, двойной rc-фильтр иначе здорово шумит.
Спойлер
Код: Выделить всё
#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;
}
тут еще следует учесть, что компаратор в тиньке врядли рельс-ту-рельс... Соответственно, вблизи нля и вблизи питания могут быть нюансы...
если скорость не важна, но нужно поточней, то ШИМ + интегрирующая цепочка + компаратор, если точность не важна, но нужно побыстрее, то можно замерить время заряда конденсатора...
я пробовал примерно таким образом питание мерять - замерял время заряжания конденсатора, всё работает, но ТКС многих конденсаторов оставляет желать лучшего... (при изменении температуры показания плывут)
я пробовал примерно таким образом питание мерять - замерял время заряжания конденсатора, всё работает, но ТКС многих конденсаторов оставляет желать лучшего... (при изменении температуры показания плывут)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv, тут еще хуже.
Кроме ТКЕ (не ТКС) конденсатора, тут еще есть засада в том, что при изменении температуры хорошо так гуляет и опорник внутри меги/тиньки.
А еще и частота встроенного "калиброванного" RC-генератора, если тактирование не от кварца.
Кроме ТКЕ (не ТКС) конденсатора, тут еще есть засада в том, что при изменении температуры хорошо так гуляет и опорник внутри меги/тиньки.
А еще и частота встроенного "калиброванного" RC-генератора, если тактирование не от кварца.





