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

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

Добавлено: Сб дек 15, 2012 19:59:06
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;
}




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

Добавлено: Сб дек 15, 2012 20:03:13
Аlex
Ребят, помогите с кодом..
Вы же код привели. В чём проблема ?

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

Добавлено: Сб дек 15, 2012 20:38:49
Engineer_Keen
Sel4 писал(а):

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

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

упс... с ADTS перепутал... :facepalm:

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

Добавлено: Сб дек 15, 2012 22:25:23
Sel4
Привести-то привел код, да ток никак он не работает... как-то трудно для понимания все эти ...ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADI.....
Пока не ясно, куда цеплять аналоговый вход - на ADC0 что ли?

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

Добавлено: Сб дек 15, 2012 22:36:52
Аlex
Документацию читать нужно, а не тыкать пальцем в небо.

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

Добавлено: Сб дек 15, 2012 22:54:45
Sel4
Для чего форум???

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

Добавлено: Сб дек 15, 2012 23:09:05
Аlex
Ну явно не для того, что-бы переписывать то, что уже написано кем то.
Ответный вопрос - А для чего даташиты ?

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

Добавлено: Сб дек 15, 2012 23:30:48
Sel4
Помогли бы лучше с кодом разобраться...

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

Добавлено: Вс дек 16, 2012 00:01:42
yaotzin
Sel4 писал(а):Помогли бы лучше с кодом разобраться...
слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С

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

Добавлено: Вс дек 16, 2012 00:38:45
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); // запустить преобразование
}

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

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

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

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

Чуток опоздал с корректировкой своего поста 8)

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

Добавлено: Вс дек 16, 2012 01:45:46
Sel4
Ой, дорогие, спасибо, !! Я ж после Ардуиновского шима медленного пытаюсь въехать в С ..Трудновато, не 16 лет...
В протеусе работает , ща прошьюсь...

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

Добавлено: Вс дек 16, 2012 02:00:51
Sel4
Вот же странно...В протеусе 10кгц показывает, а в реале как 50 гц тарахтит на нагрузке чрез мосфет.. Осциллографа нет...

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

Добавлено: Вс дек 16, 2012 02:26:04
Sel4
yaotzin писал(а): слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С
К сожалению, как-то не так показывает в протеусе - какой-то не полный ШИМ, не в ноль и практически не регулируется. И частота 10 герц в реале, :-)

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

Добавлено: Вс дек 16, 2012 04:30:04
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.

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

Добавлено: Вс дек 16, 2012 11:35:22
yaotzin

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

Добавлено: Вс дек 16, 2012 14:46:57
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); // запустить преобразование
}

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

Добавлено: Вс дек 16, 2012 16:49:27
Sel4
Раз Atmega16 имеет встроенный генератор 16МГц, то не лучше ли на нем задействовать?
Если один раз прошить фьюзы на 16МГц, то так и останется при дальнейших прошивках?

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

Добавлено: Вс дек 16, 2012 17:37:57
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МГц.