9.4.7. Регулятор яркости светодиода
(Руководство разработчика по микроконтроллерам семейства HCS08)Ниже представлен пример программного кода для регулятора яркости светодиода. В программе используется 4 кнопки для управления яркостью светодиода путем изменения коэффициента заполнения импульсного напряжения питания светодиода.
Две кнопки используются для увеличения/уменьшения яркости светодиода. Третья кнопка — для выключения светодиода, а 4-я — для включения светодиода на полную мощность (коэффициент заполнения сигнала равен 1).
В программе имеется подпрограмма прерывания по запросам модуля меток реального времени RTI. С помощью этой подпрограммы приложение каждые 128мс опрашивает состояние кнопки и реализует увеличение/уменьшение коэффициента заполнения ШИМ-сигнала, поступающего на светодиод.
Пример 9.13. Регулятор яркости светодиода
//Регуляторяркостисветодиода
//ДемонстрационнаяплатаDEMO9S08AW60
//КнопкаSW1подключенаклинииPTC2
//КнопкаSW2подключенаклинииPTC6
//КнопкаSW3подключенаклинииPTD3
//КнопкаSW4подключенаклинииPTD2
//СветодиодLEDподключенклинииPTF0(каналTPM1CH2)
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"/*Этонашфайлсобъявлениями!*/
#defineNVICGTRM(*(constchar*__far)0x0000FFBE)
#defineSW1PTCD_PTCD2
#defineSW2PTCD_PTCD6
#defineSW3PTDD_PTDD3
#defineSW4PTDD_PTDD2
unsignedintduty_cycle;
//Обработчикнажатиякнопки(вызываетсяавтоматически)
voidinterruptVectorNumber_Vrtikey_sampler(void)
{
staticcharauto_inc=1,key_timer;
charflag=0;
SRTISC_RTIACK=1;//Сбросфлагапрерывания
if(!SW1)//ЕслинажатакнопкаSW1
{
//Уменьшаемкоэффициентзаполнениясигналаназначение"auto_inc"
if(duty_cycle>auto_inc)duty_cycle-=auto_inc;elseduty_cycle=0;
key_timer++;
flag=1;//Устанавливаемфлаг,указывающийнато,чтобыланажатакнопка
}
if(!SW2)//ЕслинажатакнопкаSW2
{
//Увеличиваемкоэффициентзаполнениясигналаназначение"auto_inc"
if(duty_cycle≤TPM1MOD)
{
duty_cycle+=auto_inc;
if(duty_cycle>TPM1MOD)duty_cycle=TPM1MOD+1;
}
key_timer++;
flag=1;//Устанавливаемфлаг,указывающийнато,чтобыланажатакнопка
}
if(key_timer>4)//Есликнопкабыланажатавтечениеболее,чем4меткивремени
{
auto_inc++;//Увеличиваемзначениеauto_inc
key_timer=5;//Ограничиваемзначениепеременнойkey_timerзначением5
}
if(!flag)//ЕслинебылинажатыкнопкаSW1илиSW2
{
auto_inc=1;//Устанавливаемзначениеauto_incравным1
key_timer=0;//Обнуляемkey_timer
}
//ЕслинажатакнопкаSW3,тоустанавливаемкоэффициентзаполнениясигналаравным0
//(светодиодотключен)
if(!SW3)duty_cycle=0;
//ЕслинажатакнопкаSW4,тоустанавливаемкоэффициентзаполнениясигналаравным1
//(светодиодгоритнаполнуюяркость)
if(!SW4)duty_cycle=TPM1MOD+1;
}
voidinterruptVectorNumber_Vtpm1ovftpm1_overflow_isr(void)
{
TPM1SC_TOF=0;//Сбрасывемфлагпрерыванияпопереполнению
TPM1C2V=duty_cycle;//ОбновляемзначениекоэффициентазаполнениясигналаШИМ
}
voidmain(void)
{
SOPT=0;//НастройкарегистраSOPT1,отключениесторожевоготаймера
//НастройкамодуляICG(ICGOUT=40МГц,BUSCLK=20МГц):
ICGTRM=NVICGTRM;//ПодстройкавнутреннегогенераторамодуляIRG
ICGC2=MFDx18;//MFD=111b(N=18),RFD=000b(R=1)
ICGC1=ICG_FEI;//МодульICGврежимеFEI(CLKS=01b)
TPM1SC=bTOIE|TPM_BUSCLK;//ЧастотатактированияTPM=BUSCLK=20МГц
TPM1MOD=255;//ЧастотаШИМ-сигналаравна78.125кГц
//Настройкаканала2модуляTPM1нагенерациюШИМ-сигнала
//сВЫСОКИМактивнымуровнем
TPM1C2SC=TPM_PWM_HIGH;
TPM1C2V=0;//Коэффициентзаполнениясигналанавыходеканала2равен0
//НастройкамодуляRTIнапериодическоесчитываниесостоянийкнопок
SRTISC=bRTIE|RTI_128ms;
duty_cycle=0;
PTCPE=BIT_2|BIT_6;
PTDPE=BIT_2|BIT_3;
EnableInterrupts;
while(1);
}
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>