роботы робототехника микроконтроллеры


 Страниц (2): « 1 [2]   

> Описание: Изменение яркости.
Tehnic Post Id



Рядовой


Сообщений всего: 12
Дата рег-ции: Янв. 2009  



Белый Волк! Спасибо большое за разъяснения! Собственно вопрос, наверное, относится к Вам! Я хотел бы реализовать программный ШИМ, изменяя уровень логической единицы и нуля в нужный момент на нужном порте МК! Был бы очень признателен за помощь! т.е. каким образом записать это в программе.
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Tehnic
Вы умеете пользоваться прерываниями?
 
 Top
Tehnic Post Id



Рядовой


Сообщений всего: 12
Дата рег-ции: Янв. 2009  



Нет, но очень хотел бы научиться!(насколько я понимаю это надо для изменения яркости светодиода?) в нете я нашел текст программы:

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

#define LEDS_N 3
#define LEDS_PORT PORTD
#define LEDS_DDR DDRD

int main() {
register unsigned char scancounter=0;
register unsigned char i;
register unsigned char glow=0;
unsigned char level[20]={0,16,32}; // which part of all cycles the led is ON
unsigned char ledbits[20]={0b00001000,0b00010000, 0b00100000};

// set C5 direction - output
LEDS_DDR=0b11111111;

// turn off all leds
LEDS_PORT=0b11111111;

for(;Подмигивающий{
// main pwm part
for (i=0;i<LEDS_N;i++){
if (scancounter>=level[i]){
// off - turn on the pin
LEDS_PORT|=ledbits[i];
}
else {
// on - turn off he pin
LEDS_PORT&=~ledbits[i];
}
}
scancounter++;

// led brightness change
if (!scancounter){
for (i=0;i<LEDS_N;i++){
level[i]++;
if (level[i]>350)level[i]=0;
}
}
}

}

тут плавно тухнут три светодиода, а потом поочередно загораются. прошил контроллер, все работает. хотелось бы только понять как это происходит, чтобы реализовать это для большего количества светодиодов и создать другие эффекты.
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Общие положения:
1. Переменная scancounter выполняет роль таймера.
2. В массиве level хранится до 20 значений длительности паузы на каждом выводе, в очерёдности, соответствующей 20 номерам выводов в массиве ledbits, к которым подключаются светодиоды.
3. На каждом шаге цикла, значение "таймера" (scancounter) сверяется с level для каждого светодиода. Если время, которое отсчитал таймер, выше, либо равно длительности паузы, записанной для данного светодиода, светодиод загорается, иначе - гаснет.

Таким образом, изначально явно заданы яркости свечения каждого отдельного светодиода (чем больше число, записанное в массиве level для данного светодиода - тем больше пауза между импульсами, тем меньше яркость свечения).
Если через определённые промежутки времени изменять значение в массиве level, будет меняться яркость для соответствующего светодиода, что отображено в строке
CODE:

if (!scancounter)
for (i=0;i<LEDS_N;i++)
level[i]++;

То есть каждый раз, когда scancounter = 0, происходит увеличение времени паузы для каждого светодиода. Поскольку scancounter это unsigned char, его максимальное значение 255. Уменьшение яркости происходит каждый 256 шаг главного цикла.
Строка
CODE:

if (level[i]>350)level[i]=0;

в данном коде не имеет смысла, поскольку элементы массива level так же - unsigned char и значение 350 для них недостижимо.

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

(Отредактировано автором: 15 Января, 2009 - 22:21:02)

 
 Top
Tehnic Post Id



Рядовой


Сообщений всего: 12
Дата рег-ции: Янв. 2009  



Огромное спасибо! Изначально цель была плавное тушение или зажигание n-ого количества светодиодов. Насколько я понял лучше использовать прерывания. очень буду признателен если Вы выложите текст программы с использованием прерываний для плавного тушения светодиода! по данному алгоритму я смогу сотворить другие эффекты.
 
 Top
sound Post Id


Полковник


Сообщений всего: 70
Дата рег-ции: Нояб. 2008  



Помогите мне разобраться с апаратным шим, а то на других форумах только путают.
Мне надо понять как его настроить и как поменять яркость. Спасибо за понимание!
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Tehnic
Простой пример использования прерываний, для вывода программного ШИМ на PD0.
CODE:

#include <avr/io.h>
#include <avr/interrupt.h>

int __vector_3() //прерывание по совпадению таймера с OCR2
{
PORTD |= 1; //Установить младший бит порта D
sei(); //Глобальное разрешение прерываний
return(0);
}

int __vector_4() //прерывание по переполнению таймера
{
PORTD &= 0xfe; //Сбросить младший бит порта D
sei(); //Глобальное разрешение прерываний
return(0);
}

int main()
{
DDRD |= 1; //Сконфигурировать младший бит порта D как выход
TIMSK |= (1 << OCIE2) | (1 << TOIE2); //Разрешить вызов процедур прерывания по переполнению и совпадению для таймера 2
sei(); //Глобалное разрешение прерываний
OCR2 = 128; //Регистр сравнения таймера 2
TCCR2 = 2; //Запуск таймера 2 с делением тактовой частоты на 8
while(1); //Бесконечный цикл
return(0);
}

(Добавление)
sound
Простой пример аппаратного ШИМ (в данном случае, так называемый "Быстрый ШИМ"/Fast PWM) с выводом на OC2 (для ATmega8 - PB3):

CODE:

#include <avr/io.h>

int main()
{
TCNT2 = 0; //Сброс таймера
OCR2 = 128; //Количество тактов из 256, в течение которых на OC2 будет уровень логической единицы
TCCR2 |= (1 << WGM20) | (1 << WGM21) | (1 << COM21) | (1 << CS20); //Режим 3: быстрый ШИМ, установить лог. "0" на OC2, при совпадении, установить лог. "1" при минимальном значении
while(1); //Бесконечный цикл
}
 
 Top
Страниц (2): « 1 [2]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru