Программа листинга 2.1 не имеет принципиальных отличий от рассмотренных ранее примеров. Увеличена только частота следования импульсов. Здесь реализовано формирование периодического сигнала с переменной мощностью.
В начале на светодиод поступает импульс, длительностью в 1 секунду, в течение которого происходит свечение с полной яркостью. После чего для его питания формируется пакет импульсов, что приводит к уменьшению яркости свечения светодиода, т.к. питание осуществляется не все время, а с перерывами, и мощность отдельных световых импульсов усредняется человеческим зрением на весь период следования сигнала.
Примерная диаграмма формируемого сигнала приведена на рисунке 2.4 и 2.5. Заштрихованная фигура на графиках примерно характеризует воспринимаемую зрением яркость свечения светодиода. Усреднение импульсного сигнала на графиках рассмотрены условно со значительным упрощением переходных процессов.
Рисунок 2.4 – Диаграмма формируемого сигнала
Рисунок 2.5 – Усреднение импульсного сигнала
Листинг 2.1 – Изменение яркости свечения светодиода
//-----подключение библиотек---------------------------
//-----------------------------------------------------
#include <mega8.h> //описание памяти микроконтроллера
#include <delay.h> //временные задержки
//*****************************************************
//-----макроопределения--------------------------------
//-----------------------------------------------------
#define D 1000 //длительность сигнала
#define T 20 //период ШИМ сигнала
#define P 3 //длительность импульса
//*****************************************************
//=====ГЛАВНАЯ ФУНКЦИЯ=================================
//=====================================================
void main (void){
//-----локальные переменные----------------------------
unsigned char i; //счетчик импульсов
//-----настройка портов ввода/вывода-------------------
DDRD=0x80; //7 разряд - выход
//-----фоновая программа-------------------------------
while(1){ //бесконечный цикл
PORTD.7=1; //включить светодиод
Продолжение листинга 2.1
delay_ms(D); //на полную яркость
//-----включаем светодиод с ограничением яркости-------
for(i=0;i<D/T;i++){//пакет с заданной длительностью
PORTD.7=1; //формируем импульс
delay_ms(P); //задаем длительность импульса
PORTD.7=0; //формируем паузу между импульсами
delay_ms(T-P); //расчитываем дительность паузы
}
}//while(1)
}//END MAIN
//=====================================================
Следующий пример, представленный в листинге 2.2, выполняет ступенчатое изменение яркости свечения светодиода. В основе программы также формируются пакеты импульсов с частотой выше 50Гц.
Значение длительности импульсов определяется содержимым массива P[], а длительность паузы вычисляется непосредственно при вызове функции формирования временного интервала как разность между периодом следования сигнала и длительности импульса в строке 28.
Количество градаций яркости светодиода определяется значением переменной константного типа MAX.
Длительность сигналов одной градации и период ШИМ сигнала определены макросами в строках 8 и 9. Их также можно было определить как переменные константного типа, но это в данном случае не критично.
Стоит уделить внимание тому, как происходит формирование длительности сигналов с установленными градациями.
Так как граница восприятия зрением отдельных оптических импульсов составляет 50Гц, то периодичность ШИМ последовательности не может превышать значения 20мс, а длительность получаемых в результате преобразования аналоговых сигналов значительно превышает это время.
Таким образом, для получения аналогового сигнала требуемой продолжительности необходимо сформировать такой пакет импульсов, сума периодов в котором равнялась бы заданной величине.
Ограничение количества импульсов в пакете рассчитывается как разность между длительностью аналогового сигнала D и периодом следования ШИМ последовательности импульсов T в условиях цикла for в строке 24. Данное вычисление будет произведено однократно препроцессором на стадии компиляции исходного текста программы, из-за того, что эти имена определены как макроподстановки.
Изменение яркости свечения светодиода по отдельным градациям происходит в цикле for в строке 23, путем перебора значений массива P[], которые преобразуются в значения длительности импульса и паузы ШИМ сигнала.
Формируемый сигнал проиллюстрирован на рисунке 2.6.
Рисунок 2.6 – Диаграмма формируемого сигнала
Листинг 2.2 – Ступенчатое изменение яркости свечения светодиода
//-----подключение библиотек---------------------------
//-----------------------------------------------------
#include <mega8.h> //описание памяти микроконтроллера
#include <delay.h> //временные задержки
//*****************************************************
//-----макроопределения--------------------------------
//-----------------------------------------------------
#define D 1000 //длительность сигнала
#define T 20 //период ШИМ сигнала
//*****************************************************
//=====ГЛАВНАЯ ФУНКЦИЯ=================================
//=====================================================
void main (void){
//-----локальные переменные----------------------------
const unsigned char MAX=5;//количество градаций яркости
const unsigned char P[MAX]//значения яркости для
={1,3,5,7,18};//каждого шага
unsigned char i,j; //счетчики
//-----настройка портов ввода/вывода-------------------
DDRD=0x80; //7 разряд - выход
//-----фоновая программа-------------------------------
while(1){ //бесконечный цикл
for(i=0;i<MAX;i++) //перебираем значения яркости
for(j=0;j<D/T;j++){ //пакет с заданной длительностью
PORTD.7=1; //формируем импульс
delay_ms(P[i]); //задаем длительность импульса
PORTD.7=0; //формируем паузу между импульсами
delay_ms(T-P[i]);//расчитываем дительность паузы
}
}//while(1)
}//END MAIN
//=====================================================