dimir 2 6 сентября, 2023 Опубликовано 6 сентября, 2023 (изменено) · Жалоба Spoiler void TIM2_IRQHandler (void) { if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~ TIM_SR_UIF; IWDG->KR= 0xAAAA; if((GPIOB->IDR&GPIO_IDR_IDR1)==0) { GPIOB->BSRR|=GPIO_BSRR_BR12; // flag4=0; // flag_uroven=0; } if((GPIOB->IDR&GPIO_IDR_IDR5)==0) { nastroyki.flag=1; } if(nastroyki.flag==1) { nastroyki.pauza1++; } if(nastroyki.pauza1==10) { menu_lcd++; menu_btn++; } if(GPIOB->IDR&GPIO_IDR_IDR5) { nastroyki.flag=0; nastroyki.pauza1=0; } } } void TIM3_IRQHandler (void) { if(TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~ TIM_SR_UIF; IWDG->KR= 0xAAAA; if((GPIOB->IDR&GPIO_IDR_IDR0)==0) { pauza1=0; } else { pauza1++; } // program_start(); // if(flag_uroven==1) // { //flag_uroven=0; if(pauza1>=20) { flag_start2=0; // flag_peregruz=0; } if(pauza1>=1400) { GPIOB->BSRR|=GPIO_BSRR_BS12; GPIOC->BSRR|=GPIO_BSRR_BS13; GPIOA-> BSRR |=GPIO_BSRR_BS6; } if(pauza1>=1410) { flag_start2=1;//On ADC } if(pauza1>=1501) { GPIOA-> BSRR |=GPIO_BSRR_BR6; GPIOC->BSRR|=GPIO_BSRR_BR13; //flag_uroven=0; } } } Решил я сделать автомат уровня воды для эл. насоса .Написал программу.А она работает со збоем.В качестве управление уровнями на GPIO выбрал контакты реле ~24 v .Если ёмкость пуста реле отключённые.А при отключении работают тики в прерывании по таймеру и через минуту загрузки процессора включается двигатель.Так организован нижний уровень .А верхний уровень так.Когда насос работает срабатывает первое реле срабатывает и через время срабатывает GPIO устанавливается в лог 1.Вода дошла до верхнего уровня и GPIO устанавливается в лог 0.И двигатель стал. Проблема в том что нет стабильной работы уровней.Контролер работает стабильно.А подпрограмма в прерывании по таймеру. Изменено 7 сентября, 2023 пользователем haker_fox Тему переместил в раздел STM32. Длинный код убрал под спойлер. Текст сообщения отформатировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 32 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба Держи нас в курсе! 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба В 06.09.2023 в 13:46, VladislavS сказал: Держи нас в курсе! Ну да вы же профиссианал.Куда мне до вас.Я звёзд с неба не хватаю.А почему не стабильно работает .Проблемма аппаратная или програмная?.Если аппаратная .То как выйти с тупика.? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 7 сентября, 2023 Опубликовано 7 сентября, 2023 (изменено) · Жалоба 19 hours ago, dimir said: .В качестве управление уровнями на GPIO выбрал контакты реле ~24 v . Контакты реле не могут управлять или изменять уровень на на GPIO. Они могут подключить или отсоеденить какую-то цепь, которая и поменяет уровень на GPIO, но если нет схемы, то что у вас там собранно не понятно. Если вы ленитесь в своем коде раставить коментарии с пояснениями, то наивно ожидать, что другой будет разбираться что вы там наваяли. 19 hours ago, dimir said: Если аппаратная .То как выйти с тупика.? Все просто, покажите ел. схему, фото как собранно и вам смогут подсказать что поменять. Дребезг контактов, наводки как вы с этим боретесь? Изменено 7 сентября, 2023 пользователем codenamehawk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 7 сентября, 2023 Опубликовано 7 сентября, 2023 · Жалоба Контакты реле можно использовать как кнопку управления .Я уже решил данную проблему.Смещением включения порта В12 и понял причину почему подвисает подпрограмма.1 нужен интервал времени между включением и выключением. и 2 сместил В12 относительно включения В6 Спойлер void TIM3_IRQHandler (void) { if(TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~ TIM_SR_UIF; IWDG->KR= 0xAAAA; if((GPIOB->IDR&GPIO_IDR_IDR0)==0) { pauza1=0; } else { pauza1++; } // program_start(); // if(flag_uroven==1) // { //flag_uroven=0; if(pauza1==20) { flag_start2=0; // flag_peregruz=0; } if(pauza1==1400) { GPIOC->BSRR|=GPIO_BSRR_BS13; GPIOA-> BSRR |=GPIO_BSRR_BS6; } if(pauza1==1410) { flag_start2=1;//On ADC } if(pauza1==1450) { GPIOB->BSRR|=GPIO_BSRR_BS12; } if(pauza1==1501) { GPIOA-> BSRR |=GPIO_BSRR_BR6; GPIOC->BSRR|=GPIO_BSRR_BR13; //flag_uroven=0; } } } Вот 2 прерывания по таймеру порт В0 на вход верхний уровень.Порт В1 тоже на вход нижний уровень. а В 12 для отключения системы (насоса) В6 для включения насоса или клапана водоснабжения выходные реле подключаются параллельно.А входными цепями управляют 2 реле на ~24v их контакты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться