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

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

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

Сообщение 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;
}



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

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

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

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

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

Сообщение 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 раз.
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

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

Сообщение Sel4 »

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

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

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

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

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

Сообщение Sel4 »

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

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

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

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

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

Сообщение Sel4 »

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

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

Сообщение yaotzin »

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

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

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

Сообщение 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 КБ) 233 скачивания
Последний раз редактировалось 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]
Аватара пользователя
yaotzin
Опытный кот
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

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

Сообщение yaotzin »

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

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

Сообщение 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]
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

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

Сообщение Sel4 »

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

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

Сообщение Sel4 »

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

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

Сообщение Sel4 »

yaotzin писал(а):слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С

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

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

Сообщение 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.
Аватара пользователя
yaotzin
Опытный кот
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

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

Сообщение yaotzin »

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

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

Сообщение 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]
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

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

Сообщение Sel4 »

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

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

Сообщение 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»