Программное обеспечение ШИМ на AVR с использованием задержки - PullRequest
0 голосов
/ 01 февраля 2012

Я пытаюсь выполнить простую генерацию ШИМ, используя задержки на AVR ATMega16

То, что я пытаюсь сделать, это просто уменьшить светодиод с коэффициентом заполнения от 100% до 0%, а позже я расширю его, чтобы контролировать два цвета двухцветного светодиода, чтобы получить хороший эффект.

Раньше я делал это в mikroC с PIC, но как-то не так просто в avr-gcc, или, может быть, я что-то упустил.

Моя проблема в том, что я хочу, чтобы светодиод полностью исчезал через 3 секунды, но я чувствую, что он исчезает быстрее. Я также думаю, что он проводит больше времени на высоких рабочих циклах, чем на низких. Я имею в виду, что я вижу светодиод немного ярким, затем он тускнеет, но когда он тускнеет, он очень быстро перемещается к различным рабочим циклам, или я так думаю ...

Есть ли у вас идеи о том, что мне не хватает?

Код доступен здесь: http://ideone.com/lUP5f

Спасибо

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Проблема в том, что светодиоды не линейны. Так что не получается включить их, например, на 50%, чтобы уменьшить их яркость до 50% ..

Вы можете использовать предопределенную таблицу (например, здесь: http://www.mikrocontroller.net/articles/LED-Fading#Das_Demoprogramm)

Вам не нужно уметь читать по-немецки. Просто изучите этот кусок кода .. Например, есть 16 таблиц для 16-битного ШИМ (pwmtable_16 []).

Итак, вы можете написать:

delay_us(pwmtable_16[a]);

вместо

delay_us(a);

1 голос
/ 01 февраля 2012

Это может быть проблема с настройками предохранителя. Часы обычно управляются предохранителями, а не определением. Однако функция задержки использует #define F_CPU. Можете ли вы опубликовать свои настройки предохранителей?

Есть ли конкретная причина, по которой вы хотите использовать задержку вместо таймера для генерации ШИМ? Если вы хотите взглянуть на таймеры, я могу порекомендовать вам следующие уроки: 1) Урок по таймеру 2) ШИМ

Редактировать: кстати

 uint8_t b = 1000;

uint8_t допускает значения от 0 до 255, компилятор обычно генерирует предупреждение для этого:

.. / test.c: 16: предупреждение: большое целое число неявно усекается до типа без знака

...