해결된 질문
작성
·
98
0
전부 합체 완전체 보드~~~ 과정 중에
if(g_f_sw_fix){
printf("push_sw_fix\r\n");
g_f_sw_fix = 0;
HAL_GPIO_TogglePin(PB5_RELAY_ON_OFF_CTRL_GPIO_Port, PB5_RELAY_ON_OFF_CTRL_Pin);
}
위와 같이 버튼 interrupt 발생하여 relay 컨트롤에 반전 신호를 주면
Live Expression 또는 UART로 확인했을 때 sw_fix 및 relay 컨트롤뿐만 아니라 sw_up, sw_down, sw_on 에도 인터럽트가 발생해 값이 1로 변했다가 0으로 떨어집니다.
릴레이 컨트롤 부분을 주석처리하고 버튼 동작만 했을 땐 sw_fix만 프린트되고 값이 변하는 것을 확인했고,
회로도 구성상 잘못 연결한 부분은 없는데 어떤 게 문제일까요???
++
최초 코드 실행 or 디버그 동작 초기에 sw_up, sw_down, sw_fix, sw_on 이 전부 1로 찍혔다가 0으로 내려가는 것으로 보아, 초기 실행시 모든 GPIO 인터럽트가 발생하는 것 같은데,,
강사님의 강의 영상을 보면 초기 실행시에 아무런 인터럽트가 발생하지 않는 것 같은데 뭐가 문제일까요?
답변 1
0
위 두 경우의 공통점을 생각해보았을 때,
Relay 동작시 현재 등록되어있는 GPIO에 모든 신호가 들어가는 것 같습니다.
++ 뒤에 기입한 내용도, 현재 기준 온도를 30도 밑이면 동작하게 설정해두어,
코드가 실행이 되면 무조건 릴레이가 ON이 되는 상황이라 Relay가 켜지면서 1번 경우처럼 모든 GPIO에 신호가 가는 것 같습니다.
한가지 이상한 점은, 온도값을 기준으로 ON/OFF를 하는 heaterControll()로 ON/OFF가 될 때는, 다른 GPIO에 신호가 가지 않고 릴레이만 정상적으로 컨트롤이 됩니다.
이런 것을 보았을 땐 회로 구성은 문제 없는 것 같고, .ioc 파일도 강사님과 동일하게 설정하였는데 어떤 것이 문제일까요?
제가 보기엔 노이즈가 타는 것 같아요.
릴레이가 켜지면서 노이즈가 빵판을 타고 흐르면서..
gpio 전체에 전압을 순간 인가하는 상황이 아닌가 싶어요.
우선 예상은 그렇고, 가장 좋은건 오실로 스코프로 실제로 파형을 보고 노이즈가 타는지 찍어 보는게 제일 정확합니다.
우선 하나 하나 부분 부분 디버깅을 해보셔야 할 것 같구요.
그리고 노이즈라고 판다이 되면, 다음과 같은 조치를 할 수가 있어요.
바이패스 콘덴서 사용: 릴레이의 전원선에 바이패스 콘덴서를 추가하면 스위칭 과정에서 발생하는 노이즈를 필터링할 수 있습니다. 일반적으로 0.1µF와 10µF의 콘덴서를 병렬로 연결하면 좋습니다.
다이오드 사용: 릴레이의 코일 양단에 역방향으로 다이오드를 연결하면, 릴레이가 꺼질 때 발생하는 역기전력(spike)을 방지할 수 있습니다. 이는 릴레이의 동작으로 인한 전압 변화가 GPIO에 영향을 주지 않게 합니다.
저항 및 캐패시터 필터 회로 추가: GPIO 핀에 저항과 캐패시터를 연결하여 RC 필터를 구성하면 고주파 노이즈를 제거할 수 있습니다. 예를 들어, 10kΩ 저항과 0.1µF 캐패시터를 사용할 수 있습니다.
한꺼번에 보려고 하지 말고, 잘 분리해서 보면 답을 찾을 수 있을 것 같아요.
그 찾는 과정도 엄청난 공부가 되니 꼭 포기하지마시고..
진짜 모르겠으면 저도 한번 더 머리를 굴려 보겠습니다.
감사합니다.