PROGCONT.RU

Форма входа







Регистрация Вход/

Пример Пример Пример


STM8S Управление устройствами с помощью пульта ИК.(часть 2)

Ссылка на видео в YouTube Всем привет, смотрю предыдущая статья про пульт пользуется популярностью у любителей STM8, поэтому решил написать продолжение, где будем управлять с помощью контроллера телевизором или как захотите другим устройством управляемым пультом ИК.
 Кто не читал или хочет понять как все это работает то жмите сюда, а кто там уже был продолжаем читать данную статью.
 Начнем конечно с теории, принимать команды от пульта мы наверное научились, теперь научимся надеюсь отправлять, смотрим ниже картинку, что бы понять что от нас требуется.

нет рисунка

 А требуется следующее, настроить TIM1 в режим PWM так, что бы генерировалось каждые 26.3 микросекунд прерывание, поясню зачем на том как нужно отработать стартовую комбинацию. Начинается стартовая комбинация с несущей которая должна быть 9 миллисекунд, делаем это вот так, устанавливаем импульс ШИМ продолжительностью третья часть периода или 26.3/3=8.77 микросекунд, после отсчитываем( 9 миллисекунд делим на 26.3 микросекунд =342) 342 срабатывания, после отключаем импульс и отрабатываем паузу которая должна быть 4.5 миллисекунд( 4.5/0.0263=171) 171 срабатывания. Аналогично будет происходить отправка битов кода команд, только количество срабатываний несущей и паузы у них свои.

 Внимание! Используйте внешний кварцевый генератор для стабильности, здесь используется 16mHZ!

 Остальные настройки и работу программы опишу в коде ниже, а теперь как подключить ИК диод к контроллеру, вот схема.

нет рисунка

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

#include "stm8s.h"
void pause(uint32_t p);
//Счетчик для несущей.
uint16_t carrier_pwm=0;
//Счетчик для бита нуля или единицы.
uint16_t wait_bite=0;
//Счетчик отработанной несущей плюс 32 бита кода.
uint8_t CountSendDataToLed=0;
//Тут код команды который мы отошлем, вписывайте свой.
uint8_t codeData[4]={32,223,0,255};
//Счетчик отправленных байтов массива кода.
uint8_t arrayDataSend=0;
//Байт который будем сдвигать и проверять на наличие нуля или единицы в байте кода.
uint8_t countArrayDataSend=128;
int main( void ){
//Настраиваем тактирование от внешнего кварца.
CLK_ClockSwitchConfig( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
CLK_HSICmd(DISABLE);
//Настраиваем выводы для кнопки и ШИМ.
GPIO_Init( GPIOB, GPIO_PIN_7, GPIO_MODE_IN_FL_NO_IT);
GPIO_Init( GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
//Настраиваем TIM1 для генерации прерывания каждые 26.3 микросекунды.
TIM1_TimeBaseInit( 6, TIM1_COUNTERMODE_UP, 60, TIM1_OPMODE_REPETITIVE);
//Настраиваем TIM1_OC4 для работы в режиме ШИМ.
TIM1_OC4Init( TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, 0x0, TIM1_OCPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET);
TIM1_ClearFlag( TIM1_FLAG_UPDATE);
TIM1_ITConfig( TIM1_IT_UPDATE , ENABLE);
TIM1_OC4PreloadConfig( ENABLE);
TIM1_CtrlPWMOutputs( ENABLE);
enableInterrupts();
while(1){
pause(100000);
//Весь рабочий код, проверяем нажатие кнопки, если нажата включаем TIM1.
if(!GPIO_ReadInputPin( GPIOB, GPIO_PIN_7)){ TIM1_Cmd( ENABLE);}
}
}
//Тут все и происходит.
INTERRUPT_HANDLER( TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
//Проверяем счетчики несущей и бита байта кода, если все нули то не отрабатывается стартовая комбинация или бит.
if( carrier_pwm==0 && wait_bite==0){
//Проверяе счетчик отработок, если меньше 34 значит весь код не отправлен, иначе выключаем TIM1 и сбрасываем все счетчики.
if( CountSendDataToLed<34){
//Если счетчик отработок равен нулю значит первый раз сработало прерывание и нужно отправить стартовую комбинацию, иначе отправляем биты кода.
if( CountSendDataToLed==0){ carrier_pwm=342; wait_bite=171;}else{ if( codeData[arrayDataSend]& countArrayDataSend){ carrier_pwm=21; wait_bite=64; }else{ carrier_pwm=21; wait_bite=21;}
countArrayDataSend>>=1;
//Проверяем маску для выявление нуля или единицы, если она равна нулю значит отработали байт кода, восстанавливаем ее и прибавляем счетчик массива.
if( countArrayDataSend==0){ countArrayDataSend=128; arrayDataSend++;}
}
CountSendDataToLed++;
}else{ TIM1_Cmd( DISABLE); CountSendDataToLed=0; carrier_pwm=0; wait_bite=0; countArrayDataSend=128; arrayDataSend=0;}
}
//Проверяем, если счетчик несущей не равен нулю продолжаем ее отрабатывать, в другом случае отключаем ШИМ и ждем когда отработает бит.
if( carrier_pwm==0){ if( wait_bite!=0){ wait_bite--; TIM1_SetCompare4( 0); }}else{ carrier_pwm--; TIM1_SetCompare4( 20);}
TIM1_ClearFlag( TIM1_FLAG_UPDATE);
}
void pause( uint32_t p){
for( uint32_t i=0; i<p; i++){}
}
#ifdef USE_FULL_ASSERT
void assert_failed( uint8_t* file, uint32_t line)
{
while (1){}
}
#endif

 Обращаю внимание, что данный передатчик сможет работать с устройствами принимающие сигнал на частоте 38kHZ и что бы узнать коды команд вашего пульта нужно где раздобыть документацию или обратится к предыдущей статье. На этом все!


Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!