Помогите, Atmega16 ШИМ+потенциометр..

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Ребят, помогите с кодом.. Много чего пролистал.. Везде только и есть регуляторы кнопочные. Вероятно, с потенциометром это очень просто, что никто не заморачивается.. Нужно регулировать скважность переменным резистором.
Резистор на входе ацп. Частотой, желательно, килогерц 10 -15. Контроллер для того, что на скважность влияют несколько таких резистров/датчиков.

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

#include<avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
  //инициализация портов
  PORTB = 0;
  DDRB = 0x01;
  
  //инициализация таймера Т0
  TIMSK = 0;
  //реж. - fast pwm, вывод OC0 - неинверт. шим, clk/64
  TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
  TCNT0 = 0;
  OCR0 = 0;
   //инициализируем АЦП
  //ион - напряжение питания, выравнивание влево, нулевой канал
  ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
  //вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  //режим непрерывного преобразования
  SFIOR = 0;
  
 sei();                                    // __enable_interrupt(); - B AVRStudio 4.19 такое не компилица.
  while(1);
  return 0;
}

//********************************
//прерывание АЦП

ISR(ADC_vect)                              //#pragma vector=ADC_vect __interrupt void adc_my(void) -  и это тоже.
{
  //считываем старший регистр АЦП и 
  //записываем в регистр сравнения
  OCR0 = ADCH;
}



Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Ребят, помогите с кодом..
Вы же код привели. В чём проблема ?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Sel4 писал(а):

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

  
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADPS="111" - срабатывание по захвату в таймере1, а он тут вообще не задействован. Непрерывное преобразование это "000"

упс... с ADTS перепутал... :facepalm:
Последний раз редактировалось Engineer_Keen Вс дек 16, 2012 10:32:34, всего редактировалось 1 раз.
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Привести-то привел код, да ток никак он не работает... как-то трудно для понимания все эти ...ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADI.....
Пока не ясно, куда цеплять аналоговый вход - на ADC0 что ли?
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Документацию читать нужно, а не тыкать пальцем в небо.
Реклама
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Для чего форум???
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Ну явно не для того, что-бы переписывать то, что уже написано кем то.
Ответный вопрос - А для чего даташиты ?
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Помогли бы лучше с кодом разобраться...
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

Sel4 писал(а):Помогли бы лучше с кодом разобраться...
слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С
Вложения
44 ADC.zip
(98.9 КБ) 276 скачиваний
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 25, 2010 00:28:14
Откуда: Ukraine

Сообщение Viver »

Sel4 писал(а):Помогли бы лучше с кодом разобраться...
Здравствуйте! :))

Что-то у меня тоже автоматически преобразование запустится не захотело... :dont_know:

Но если прописать запуск вручную и назначить правильный порт на выход, то в протеусе работает... :write:

Кстати, если для чего-то в железе, то (ИМХО) нуна добавить какое-нить усреднениеинтегрирование...

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

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

int main(void)
{
 	//инициализация портов
  	PORTB = 0;
  	DDRB = 0x08; //<----------

  	//инициализация таймера Т0
  	TIMSK = 0;
  	//реж. - fast pwm, вывод OC0 - неинверт. шим, clk/64
  	TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
  	TCNT0 = 0;
  	OCR0 = 0;
   	
	//инициализируем АЦП
  	//ион - напряжение питания, выравнивание влево, нулевой канал
  	ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
  	//вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
  	ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  	//режим непрерывного преобразования
  	SFIOR &= 0x1F;
  
 	sei();   
  	
  	while(1);
}

ISR(ADC_vect)                              
{
  	//считываем старший регистр АЦП и 
  	//записываем в регистр сравнения

  	OCR0 = ADCH;

	ADCSRA |= _BV(ADSC); // запустить преобразование
}
Вложения
Radiokot.zip
Проектик....
(30.56 КБ) 235 скачиваний
Последний раз редактировалось Viver Вс дек 16, 2012 00:44:42, всего редактировалось 1 раз.
[size=70][b][i][color=#0000BF]Опыт - это когда на смену вопросам "что?", "где?", "когда?", "как?" и "почему?" приходит единственный вопрос: "на*я?".[/color][/i][/b][/size]
[size=70][b][i][color=#BF00FF]Всякий раз когда у тебя проблемы - помни - большинству н*ть![/color][/i][/b][/size]
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

подумав немного, хм.... в реале оно не так работать будит :))) поскольку входное напряжение будит изменятся все время на делителе прыгая, то и OCR все время будит прыгать то +1 то -1=))
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 25, 2010 00:28:14
Откуда: Ukraine

Сообщение Viver »

yaotzin писал(а):подумав немного, хм.... в реале оно не так работать будит :))) поскольку входное напряжение будит изменятся все время на делителе прыгая, то и OCR все время будит прыгать то +1 то -1=))

Чуток опоздал с корректировкой своего поста 8)
[size=70][b][i][color=#0000BF]Опыт - это когда на смену вопросам "что?", "где?", "когда?", "как?" и "почему?" приходит единственный вопрос: "на*я?".[/color][/i][/b][/size]
[size=70][b][i][color=#BF00FF]Всякий раз когда у тебя проблемы - помни - большинству н*ть![/color][/i][/b][/size]
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Ой, дорогие, спасибо, !! Я ж после Ардуиновского шима медленного пытаюсь въехать в С ..Трудновато, не 16 лет...
В протеусе работает , ща прошьюсь...
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Вот же странно...В протеусе 10кгц показывает, а в реале как 50 гц тарахтит на нагрузке чрез мосфет.. Осциллографа нет...
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

yaotzin писал(а): слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С
К сожалению, как-то не так показывает в протеусе - какой-то не полный ШИМ, не в ноль и практически не регулируется. И частота 10 герц в реале, :-)
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Было:
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
Переставил вот так:
TCCR0 = (1<<WGM21)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00)|(1<<CS00)|(1<<CS00);
Так как было, было как 50Гц, сейчас свист около 3Кгц, хотя в протеусе на осциллографе 17 us.
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

Вложения
New folder2.zip
(98.02 КБ) 234 скачивания
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Чт мар 25, 2010 00:28:14
Откуда: Ukraine

Сообщение Viver »

Sel4 писал(а):Вот же странно...В протеусе 10кгц показывает, а в реале как 50 гц тарахтит на нагрузке чрез мосфет.. Осциллографа нет...
Возможно, что Вы считаете для кварца, а фьюзы на "железе" соответственно не шьете.... :dont_know:

Тот же код с просчитанными частотами ШИМа для тактового сигнала 1 МГц:
Спойлер

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

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

int main(void)
{
 	//инициализация портов
  	PORTB = 0;
  	DDRB = 0x08;

  	//инициализация таймера Т0
  	//реж. - fast pwm, вывод OC0 - неинверт. шим, 
  	TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|
	// Для 1МГц:
	//	CS02CS01CS00	Предделитель	Тактовая таймера, кГц	Частота ШИМа, Гц
	//		101				1024			0,977					3,83
	//		100				256				3,906					15,31
	//		011				64				15,625					61,25
	//		010				8				125,000					490,19
	//		001				1				1000,000				3921,56
			(0<<CS02)|(1<<CS01)|(1<<CS00); //clk/64
	TIMSK = 0x00;
  	TCNT0 = 0;
  	OCR0 = 0;
   	
	//инициализируем АЦП
  	//ион - напряжение питания, выравнивание влево, нулевой канал
  	ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
  	//вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
  	ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  	//режим непрерывного преобразования
  	SFIOR &= 0x1F;
  
 	sei();                                    // __enable_interrupt(); - B AVRStudio 4.19 такое не компилица.
	
	for(;;);  	
}

ISR(ADC_vect)                              
{
  	//считываем старший регистр АЦП и 
  	//записываем в регистр сравнения
  	OCR0 = ADCH;
	ADCSRA |= _BV(ADSC); // запустить преобразование
}
[size=70][b][i][color=#0000BF]Опыт - это когда на смену вопросам "что?", "где?", "когда?", "как?" и "почему?" приходит единственный вопрос: "на*я?".[/color][/i][/b][/size]
[size=70][b][i][color=#BF00FF]Всякий раз когда у тебя проблемы - помни - большинству н*ть![/color][/i][/b][/size]
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

Сообщение Sel4 »

Раз Atmega16 имеет встроенный генератор 16МГц, то не лучше ли на нем задействовать?
Если один раз прошить фьюзы на 16МГц, то так и останется при дальнейших прошивках?
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Sel4 писал(а):TCCR0 = (1<<WGM21)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00)|(1<<CS00)|(1<<CS00);
Это эквивалентно:
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
В меге16 нет генератора на 16МГц максимум 8, это максимальный разгон 16МГц.
Ответить

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