2012-02-01 6 views
0

Я пытаюсь выполнить простую генерацию ШИМ с использованием задержки на условиях AVR ATmega16Программное обеспечение PWM на AVR с использованием задержки

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

Я уже делал это в mikroC с PIC, но как-то это не так легко в avr-gcc, или, может быть, я чего-то не хватает.

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

Любые идеи, которые могут возникнуть по поводу того, что мне не хватает?

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

Благодаря

ответ

1

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

Есть ли конкретная причина, по которой вы хотите использовать задержку вместо таймера для генерации PWM? В случае, если вы хотите иметь взгляд на таймерах я могу рекомендовать эти учебники для Вас: 1) Timer Tutorial 2) PWM

Edit: Кстати

uint8_t b = 1000; 

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

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

+0

спасибо, я уверен, его не установка предохранителя, так как они были установлены для меня друг, который уже сделал это :) , но кроме этого, ваши ссылки очень полезны, а также предупреждение о максимальном значении, его любопытное странное, что мой avr-gcc не вытащил этот ... любой параметр, который я должен указать, так что я t показывает предупреждения тоже? –

+0

Еще раз спасибо, я перекодировал все это с нуля, и это работает как шарм прямо сейчас!Это было главным образом из-за uint8_t, поэтому я должен вам один;), но любые идеи, если в командной строке есть флаг, который я должен передать avr-gcc, чтобы получить все предупреждения тоже? –

+0

какой IDE вы используете? – user1176976

1

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

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

Вы не нужно уметь читать немецкий язык. Просто изучите этот фрагмент кода. Есть несколько таблиц, например, для 16-разрядного PWM (pwmtable_16 []).

Таким образом, вы можете написать:

delay_us(pwmtable_16[a]);

вместо

delay_us(a);

+1

Спасибо! Это очень поучительно, я думал, что это был только я, но, оказывается, его светодиоды так приятно знать :) –

 Смежные вопросы

  • Нет связанных вопросов^_^