настроить АЦП

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

ARV писал(а)::shock:не представляя себе, что этот синус обозначает и нафига он нужен?! или без проблем жизнь кислая?

извините за оффтоп.
А вы так и будете заниматься унижением???,так и скажите что вам просто нравиться так делать
Реклама
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

sirha При внутреннем Vref=1.1В результат должен быть 1В*1023/1.1В=930 = 0x3a2. Т.е. ADCL - 0xa2, ADCH - 0x3.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

vdavid писал(а):sirha При внутреннем Vref=1.1В

А внутреннее всегда такое? как то его менять можно?

когда подключаю внешнее что то нужно менять в настройках и что?

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

#include <tiny13.h>
#include <delay.h>


interrupt [ADC_INT] void adc_isr(void) {


PORTB=~ADCL ;
delay_ms(5); } 



void main(void) {
 
PORTB=0xFF; 
DDRB=0xFF; 

ADCSRA=0x8F; 

#asm("sei") 
    ADMUX=0x00;
   ADCSRA|=0x40;

while (1) ;

} 

подаю 1 вольт

должно получиться 0xA2=10100010

но горят светодиоды так PB0=0;PB1=1;PB2=0;PB3=0;PB4=1;PB5=1;

?

почему так получается
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Внутреннюю опору изменить нельзя. Только 1.1В. За ее выбор отвечает 6-й бит в ADMUX. Если там 0, то в качестве опорного выбрано напряжение питания тиньки. Вывод ADC0 (он же PB5) читать бессмысленно, поскольку без прошитого фюза RSTDSBL он выполняет роль RESET. Прошивать этот фьюз не советую, потому, что без высоковольтного программатора с тинькой ничего уже сделать будет невозможно.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Некоторое время назад я баловался с аналогичной задачей - использовать АЦП чтобы определить, какая кнопка нажата.
Вложения
adcknob.c
(4.42 КБ) 281 скачивание
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

vdavid писал(а): Вывод ADC0 (он же PB5) читать бессмысленно, поскольку без прошитого фюза RSTDSBL он выполняет роль RESET. Прошивать этот фьюз не советую, потому, что без высоковольтного программатора с тинькой ничего уже сделать будет невозможно.
все правильно,я его в протеусе прошил),токо светодиоды зажглись не совсем так как нужно,
прочитайте то что я выше написал
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Барсик писал(а): использовать АЦП чтобы определить, какая кнопка нажата.
Наверно, не самый лучший способ. Переходное сопротивление контактов может внести коррективы.
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Про PB5 в любом случае забудьте. Он может работать либо как вход АЦП, либо как цифровой вывод. И то и другое совместить никак не получается. А какое у Вас напряжение питания? Ведь оно используется в качестве опорного. Поэтому на выходе должно быть Uadc0*1023/Uпит
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Jack_A писал(а):Наверно, не самый лучший способ.
На 7 кнопок работает устойчиво на резисторах с допуском +/- 5%.
Буржуины вовсю применяют такой способ, когда у микроконтроллера ног не хватает.
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

nirq писал(а):Мне тоже нравиться заниматся унижением.
поздравляю вас ,а смысл то что вы пишите,может хватить флудить всякой ерундой

Один умный человек сказал: "Унижая других, унижаешь себя",можете начинать,ведь ни на что другое вы больше не способны.
vdavid писал(а): А какое у Вас напряжение питания? Ведь оно используется в качестве опорного. Поэтому на выходе должно быть Uadc0*1023/Uпит
не понимаю)
выже говорите про внутреннее 1.1 вольт,а теперь спрашиваете про питание,питание контроллера 5 вольт,вообще проект я делал токо в протеусе.
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

sirha,

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

#include <tiny13.h>
#include <delay.h>

interrupt [ADC_INT] void adc_isr(void) {
  PORTB=~ADCL & 0x1f ;
  ADCSRA |= (1<<ASDSC);   // Запустить следующее преобразование 
} 

void main(void) {
  DDRB=0x1F;   // PB5 (ADC0) - на ввод 
  ADCSRA=0x8F; 
  #asm("sei") 
  ADMUX=0x00;  // Вход ADC0, опора - напряжение питания
//  ADMUX=(1 << REFS0);  // Вход ADC0, опора - внутренняя (1.1В)
  ADCSRA|=(1<<ASDSC);
  while (1) ;
}
Родился
Сообщения: 1
Зарегистрирован: Вт дек 30, 2014 21:24:38

Сообщение Котейко1990 »

делаю АЦП на ATmega16 на 2 канала. оба работают нормально, но при увеличении напряжения на входе до 0,5 В состояние портов В и С не изменяется. на выходах устанавливается 0b110010 т.к. внешний источник AREF =1.024 B и далее ничего на выходе не изменяется. что я делаю не так? :shock:

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


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void  preset(){
	DDRA=0x0;
	ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
	ADMUX=(0<< REFS1)|(0<< REFS0)|(0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
	
	DDRD=0b00110000;
	TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
	TCCR1B=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
	
	DDRB=0xFF;
	PORTB=0x00;
	DDRC=0xFF;
	PORTC=0x00; }
	
unsigned int ADC_result(unsigned char adc_input){
	ADMUX=adc_input | (ADMUX & 0xF0);
	_delay_us(5);
	ADCSRA =ADCSRA|(1<<ADSC);
	while((ADCSRA & 0x10)==0); 
	ADCSRA|=0x10;
	return ADCW;}
	
int main(void){
	preset();
	
	while(1){
	PORTB=ADC_result(0);
	PORTC=ADC_result(7);
	}
	
	}

Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Потому что результат измерения у Вас 2 байта, а порт может принять размер данных всего в 1 байт. Старший байт просто обрезается. Либо выводите в два порта отдельно младшую и отдельно старшую часть, либо сдвигайте результат измерений влево (бит ADLAR must установлен в 1 в регистре ADMUX).
И читайте результат только из региста ADCH
Fucking static initialization order fiasco
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Котейко1990 писал(а): что я делаю не так? :shock:
Порт В и порт С устанавливаются одинаково?
Относительно порта С, первое что приходит в голову - включен JTAG, нужно отключить, если включен.
Ответить

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