Файлы  •  Ссылки  •  Прошивки  •  Правила  •  Архив  •   FAQ  •  Участники  •  Поиск
Регистрация  •  Вход

ATiny13 и ШИМ

Список форумов» Программное обеспечение» Микроконтроллеры
АвторСообщение
stepmotor
Новичок
Сообщения: 6




24-08-2008 09:59

Подскажите как на ATiny13 в CodeVisionAVR можно реализовать ШИМ на ножке PB0 так чтобы можно было его регулировать подстроечным резистором в периоде от 20 до 100 кГц..

Добавлено 24-08-2008 10:58

Собственно схема .. софт не получается пока реализовать.. я начинающий пока сильно не разбираюсь.. спасибо.

Собственно схема



Vasil_
Забанен
Забанен
Сообщения: 203




24-08-2008 18:37

А какой смысл в применении микроконтроллера для решения этой задачи? Вполне можно обойтись одним операционником, тем более, плавной перестройки по частоте не получится.

Добавлено 24-08-2008 18:59

Прям токошо на одном из форумов по данной тематике завесили ссылку:
http://www.tfelectronics.com.au/software/PWMcalc.exe
GarikBaza
Новичок
Сообщения: 664




24-08-2008 20:00

Собственно что нужно, ШИМ или генератор?
Vasil_
Забанен
Забанен
Сообщения: 203




24-08-2008 20:25

Судя по всему, от скважности будет зависеть яркость свечения диода. Но максимальная частота таймера в режиме PWM 15625KHz при 8MHz тактовой.Т.е. яркость(скважность) то можно будет регулировать, а частоту в требуемом диапазоне- нет, да и не понятно,- зачем?
ЗЫ, даже если это будет шаговый двигатель, то закачать в него на таких частотах рабочий ток- нереально.
stepmotor
Новичок
Сообщения: 6




25-08-2008 01:29

Цитата:
ЗЫ, даже если это будет шаговый двигатель, то закачать в него на таких частотах рабочий ток- нереально.

Почему ? работают же драйверы с ШИМ частотой 20кГц и в пределах до 100кГц.. вот например описание оного из множества http://purelogic.ru/PDF/Driver/PLD007.pdf
starko
Гость 77.94.*.*





25-08-2008 05:30

У меня по ATiny13 опыта нет, но заглянул в даташит, и ...недоумение:
Vasil_ писал:
максимальная частота таймера в режиме PWM 15625KHz при 8MHz тактовой
Это так для двустороннего ШИМ (Phase Correct PWM Mode), а для простого ШИМ (Fast PWM Mode) частота вдвое выше, т.е. 31.25кГц.
К тому же, ничего не мешает пожертвовать один из таймерных компараторов на уменьшение длительности периода ШИМ. На PB0 работать не будет, только на PB1, вроде так, но в принципе-то можно.
Да и внутренний генератор можно накрутить до 16МГц, при нормальных условиях.

Однако, действительно, что за задача такая чуднАя?
Vasil_
Забанен
Забанен
Сообщения: 203




25-08-2008 07:34

stepmotor писал:

Почему ? работают же драйверы с ШИМ частотой 20кГц и в пределах до 100кГц.. вот например описание оного из множества http://purelogic.ru/PDF/Driver/PLD007.pdf

Ну, может и так улыбка , только все равно и напряжение до 80-90 В поднимать нужно, и обмотки впараллель, и на больших оборотах момент резко падает. ИМХО, все же драйвер нужно делать аппаратно, а что нибудь вроде L297 не подходит? или уже снята с производства?
По теме: инициализируем контроллер(настраиваем порты ,таймеры, АЦП) . Измеренное значение можно считывать, например, по прерыванию от АЦП. Если ADLAR = 0 читаем ADC, результат смещаем вправо на 2, и загружаем в OCR0A,или если ADLAR = 1 читаем ADCL и загружаем в OCR0A.
Т.о. можно получить 256 значений скважности(ШИМ), а вот частоту придется менять переключением прескалеров. Хоть какй то кусок кода уже написан?
starko
Гость 77.94.*.*





25-08-2008 19:15

если ADLAR = 1 читаем ADCH

частоту прескалером можно только уменьшить( в 8, 64, 256 или 1024 раз).

Если не синхронизировать работу ADC с PWM, там такая свистопляска будет... поболее, чем обрасываемые 2 младших разряда, я так думаю.
stepmotor
Новичок
Сообщения: 6




25-08-2008 19:48

Vasil_ писал:

а что нибудь вроде L297 не подходит? или уже снята с производства?


Нет, просто у нее параметры низкие.. хотелось бы сделать на выходе ir2101и IRFZ44N
Vasil_
Забанен
Забанен
Сообщения: 203




25-08-2008 21:28

starko, ты прав, ADCH. Синхронизировать- зачем? Там наоборот бы надо ввести "антидребезг" /задержку, но думаю , даже такой код заработает(только в CV имя прерывания может быть другим)
Код:

volatile unsigned char wait = 0;
volatile unsigned char data_for_pwm;
void main(void)
{
 // произвести инициализации;
 ADCSR|=0x40; //start conversion
 for(;;)
 {
  while(wait); // ждем прерыване от таймера эквивал. while(wait!=0);   
                   // "пока  wait не ноль"
  OCR0A=data_for_pwm;
  wait=1;            // очищаем флаг
 }
}
#pragma vector=ADC_vect
 __interrupt void adcon(void)
{
 data_for_pwm=ADCH;
 ADCSR|=0x40; //start conversion
}
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0_OVF0_out_now(void)
{
wait = 0; // прерывание произошло
}

stepmotor, ты как в мою коробку глядел улыбка , лежат заготовленные IR2104 и IRFZ34N . Потом, чтоб не возиться, были закуплены два М840 / 880:
http://www.giden.ru/sm_driver.html
и два FL110, да так года два уже и валяются на складе, начальство сказало -до лучших времен
stepmotor
Новичок
Сообщения: 6




25-08-2008 23:20

Цитата:
stepmotor, ты как в мою коробку глядел улыбка , лежат заготовленные IR2104 и IRFZ34N . Потом, чтоб не возиться, были закуплены два М840 / 880:
http://www.giden.ru/sm_driver.html
и два FL110, да так года два уже и валяются на складе, начальство сказало -до лучших времен


да я тоже закупаю себе в purelogic.ru и в protos.de ..
а так хотел сам попробовать что нибудь хорошее для души сваять.. улыбка
starko
Гость 77.94.*.*





26-08-2008 05:54

Vasil_ писал:
Синхронизировать- зачем?
Измерения должны идти непрерывно, так? ШИМ тоже?
Если установить время преобразования меньше периода таймера, то по прерыванию от таймера запускать ADC.
Если больше - то еще и запрещать его (прерывание). А по прерыванию от ADC - разрешать.
И про ADC Noise Reduction не забываем.
И лучше не сразу в OCR0A закладывать, а после усреднения.

Да, а как это устройство с шаговиком-то увязывается? Как происходит управлении, что куда идет?
Vasil_
Забанен
Забанен
Сообщения: 203




26-08-2008 07:39

starko, ты снова прав улыбка , изменил там код хоть и не люблю оператор "пока" (одни прерывания- улыбка ) . Думаю, data_for_pwm "шуметь" не будет, так что можно пробовать без усреднения, но пора вдыхать в железо, да смотреть. Допиши инициализацию, пусть уже человек стартонет подмигивание
starko
Гость 77.94.*.*





26-08-2008 19:23

Можно, конечно и дописать, но на это надо какое-то время - заготовки у меня нет, функции C под AVR я подзабыл... но попробую, чуть попозже.
Что хочу сразу сказать, если усреднения не надо, то нечего и while крутить. Надо примерно примерно так:
while(1){ Sleep();} //или как оно пишется
перед этим установить SleepMode=Idle.
В прерываниях сделать запреты и разрешения, как писал выше.
Vasil_
Забанен
Забанен
Сообщения: 203




26-08-2008 22:33

Ясно. Вобщем, воспользовался CV визардом, он мне такого нагенерил, что половину зарэмить пришлось, зато листинг большой гы-гы Все эти визарды,- разврат для начинающих, пока даташит не почитаешь, да ручками регистры не пропишешь, толку от такого "изучения " -не будет.
Подправил имена регистров и прерываний- откомпилился без ошибок и ворнингов, пробуй, у меня проверить в железе неначем. Весь проект, вместе с .hex, в архиве.

  PWM.rar  22,96 КБ  Скачано: 781 раз(а)

stepmotor
Новичок
Сообщения: 6




26-08-2008 23:17

О спасибо, попробую..
starko
Гость 77.94.*.*





27-08-2008 06:17

Vasil_, ну и что оно получилось? АЦП сам себя запускает, без привязки к таймеру. Не вижу, где он в первый раз стартует. Замешательство
Для чего while с флагом, если OCR0A=data_for_pwm можно просто перенести в прерывание, и главное, а что оно дает?

По инициализации все вроде бы правильно...

А что, использовать спячку релирия не позволяет?
Список форумов» Программное обеспечение» Микроконтроллеры» ATiny13 и ШИМ
Перейти:  
Текущий раздел» Программное обеспечение» Микроконтроллеры (Микроконтроллеры - AVR-ы, PIC-и и другие)








Информация по ремонту для специалистов - справочники, инструкции, энциклопедия, советы и секреты ремонта,  настройка, сервисные режимы
Powered by phpBB 2.0.18 © 2001, 2002 phpBB Group!