PROGCONT.RU

Форма входа







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

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


STM8S счётчик импульсов на индуктивном датчике приближения и оптическом прерыватели.

Ссылка на видео в YouTubeВ статье я покажу как с помощью контроллера STM8S903K3 и семисегментного модуля на драйвере MAX7219 сделать самим например счётчик оборотов с применение индуктивного датчика LJ12A3-4-Z/BX или щелевого оптического прерывателя.

Для этого будем использовать в программе контроллера внешнее прерывание от события спада напряжения на выводе PD7 и его обработчик в котором и будем подсчитывать эти события.

Пример кода программы и схемы подключения индуктивного датчика и щелевого оптического прерывателя.


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

#include "stm8s.h" #define Decode_Mode 9 #define Intensity 10 #define Scan_Limit 11 #define Shutdown 12 #define Display_Test 15 void LCD_Send_Data( uint8_t address, uint8_t data); uint32_t count = 0; int main( void ){ CLK_DeInit(); /*Настройка для SPI выводов.*/ GPIO_Init( GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init( GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init( GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST); /*Настройка самого SPI для передачи данных.*/ SPI_Init( SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT, 0x07); SPI_Cmd(ENABLE); /*Инициализация MAX7219.*/ LCD_Send_Data( Shutdown, 1); LCD_Send_Data( Display_Test, 0); LCD_Send_Data( Decode_Mode, 255); LCD_Send_Data( Intensity, 3); LCD_Send_Data( Scan_Limit, 7); LCD_Send_Data( Scan_Limit, 7); uint32_t mask=10000000; uint32_t number; /*Включаем внешнее прерывание TLI.*/ EXTI_SetTLISensitivity( EXTI_TLISENSITIVITY_FALL_ONLY); /*Включаем прерывание по спаду напряжения на выводе 7 порта D.*/ GPIO_Init( GPIOD, GPIO_PIN_7, GPIO_MODE_IN_PU_IT); enableInterrupts(); /*Настройка кнопки сброса счётчика.*/ GPIO_Init( GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT); while(1){ number=count; /*Цикл вывода информации на LED модуль.*/ for( uint8_t i=8; i>0; i--){ LCD_Send_Data( i, (uint8_t)(number/mask)); number=number-(number/mask*mask); mask/=10; } mask=10000000; for( uint32_t e=0; e<100; e++); /*Сброс счётчика если нажата кнопка сброса.*/ if( !GPIO_ReadInputPin( GPIOB, GPIO_PIN_7))count = 0; } return 0; } /*Прерывание подсчёта срабатываний.*/ INTERRUPT_HANDLER( TLI_IRQHandler, 0){ if( !GPIO_ReadInputPin( GPIOD, GPIO_PIN_7)){ count++; if(count == 100000){count = 0;} } } /*Функция отправки адреса и данных.*/ void LCD_Send_Data( uint8_t address, uint8_t data){ GPIO_WriteLow( GPIOC, GPIO_PIN_7); SPI_SendData(address); while(!SPI_GetFlagStatus(SPI_FLAG_TXE)); SPI_SendData(data); while(SPI_GetFlagStatus(SPI_FLAG_BSY)); GPIO_WriteHigh( GPIOC, GPIO_PIN_7); } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line){while (1){}} #endif


Схема подключения к индуктивному датчику приближения LJ12A3-4-Z/BX, так как данный датчик питается от напряжения от 6V и до 36V контроллер придётся защитить с помощью оптической пары PC817, в схеме используются питания 12V.

Инкремент счёта происходит сразу после контакта датчика с металлическим предметом.

NO

Схема для подключения оптического щелевого прерывателя.

NO

Если для индуктивного датчика прибавления счёта происходило сразу после контакта то здесь после выхода заслонки из щели. Если нужно срабатывание зразу после помещения заслонки то измените в коде программы две строки:

    1. Настройка внешнего прерывания в теле программы
      EXTI_SetTLISensitivity( EXTI_TLISENSITIVITY_FALL_ONLY);
      на
      EXTI_SetTLISensitivity( EXTI_TLISENSITIVITY_RISE_ONLY);
    2. И в обработчике прерывания
      if( !GPIO_ReadInputPin( GPIOD, GPIO_PIN_7)){ count++; if(count == 100000){count = 0;} }
      на
      if( GPIO_ReadInputPin( GPIOD, GPIO_PIN_7)){ count++; if(count == 100000){count = 0;} }




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