inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Dự án thực hành nhúng học qua xe scooter điện

Phân tích mã firmware của xe scooter điện (2)

전류 센싱 문의

Đã giải quyết

62

dayday

29 câu hỏi đã được viết

0

안녕하세요.


제어쟁이님,

1. 아래에서 2048 빼주는 이유는 0A일때 2.5V 이므로, 2048을 빼주는 건가요..??

// 평균 오프셋 계산

Ias_Offset = (Ias_Offset/10) - 2048;

Ibs_Offset = (Ibs_Offset/10) - 2048;

Ics_Offset = (Ics_Offset/10) - 2048;


  1. 업카운트 50us + 다운카운트 50us 이후에 100us 마다 인터럽트가 발생하도록 설계하신게 맞나요..?? (즉, 이벤트2번 = 인터럽트1번)





임베디드 stm32 hardware motordriver artwork

Câu trả lời 2

0

insid2embedded

안녕하세요.제어쟁이입니다

여기서 2048이 나오는 이유는 전류 측정 회로에서 전류가 0 A일 때의 출력 전압을 1.65 V로 잡아두었기 때문입니다. ADC의 특성과 코드의 보정 과정을 나눠서 보시면 이해하기 쉽습니다.

1. 왜 1.65 V가 2048인가요?

STM32F767의 ADC를 12비트로 사용하면 측정 결과는 0~4095, 총 4096단계로 표현됩니다. 기준 전압이 3.3 V라면 그 절반인 1.65 V는 약 2048에 해당하는 것이죠.

그런데 왜 전류가 0 A일 때 0 V가 아니라 1.65 V가 나오도록 만들었을까요?

ADC는 이 조건에서 0~3.3 V 범위의 전압을 측정하므로, 음의 전압을 그대로 입력해서 측정할 수 없기 때문입니다. 그래서 회로에서 신호에 1.65 V를 더해두고, 그 전압을 기준으로 위아래로 변하는 신호를 측정하는 것입니다.

예를 들어 원래 측정하려던 신호가 +0.2 V라면 ADC에는 1.85 V가, −0.2 V라면 1.45 V가 들어가도록 만드는 것이죠. 이후 소프트웨어에서 1.65 V를 다시 빼주면 원래 신호를 구할 수 있습니다.

2. 그러면 코드에서는 왜 평균값에서 2048을 빼나요?

첨부 코드에서는 초기화할 때 각 상의 ADC 값을 10번 읽어 합산한 뒤, 다음과 같이 계산합니다.

Ias_Offset = (Ias_Offset / 10) - 2048;

여기서 저장하려는 것은 1.65 V 전체가 아니라, 실제 영점 측정값이 기준값인 2048에서 얼마나 벗어났는지입니다.

예를 들어 전류가 흐르지 않는 상태에서 ADC 평균값이 2068로 측정됐다고 해보겠습니다. 그러면 보정값은 다음과 같습니다.

보정값 = 2068 - 2048 = 20

즉, 전류가 0 A인데도 기준보다 20만큼 높게 측정되고 있다는 뜻입니다. 따라서 이후 측정값에서 이 20을 빼주면 영점 기준을 2048에 맞출 수 있습니다.

실제 전류 계산 부분에서도 먼저 result - Ias_Offset으로 이 차이를 보정하고, 전압으로 환산한 다음 OFFSET_Volt를 빼는 순서로 처리하고 있습니다. 여기서 회로에 더해둔 1.65 V를 제거하는 것입니다.

정리하면, 처음의 평균값 - 2048은 영점 오차를 구하는 과정이고, 이후의 1.65 V 빼기는 회로에서 의도적으로 더해둔 전압을 제거하는 과정입니다. 같은 오프셋을 두 번 빼는 것이 아니라, 두 가지를 나눠서 처리한다고 이해하시면 됩니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. dayday님.

네, 2048은 12비트 ADC에서 0A일 때의 오프셋을 제거하기 위한 값입니다.

12비트 ADC의 전체 범위는 0~4095이고, 중간값은 다음과 같습니다.

4095 / 2 ≈ 2048

전류가 0A일 때 전류 센서 출력이 ADC 기준 전압의 중간값인 약 1.65V가 되도록 설계되어 있다면, ADC 원시값은 대략 2048이 됩니다. 따라서 평균 오프셋을 계산한 뒤 2048을 빼면 0A 기준점을 0으로 맞출 수 있습니다.

Ias_Offset = (Ias_Offset / 10) - 2048;

예를 들어 평균 ADC 값이 2050이라면 오프셋은 다음과 같습니다.

2050 - 2048 = 2

이후 전류 계산에서 이 오프셋을 보정하면 센서의 영점 오차를 줄일 수 있습니다.

다만 질문하신 것처럼 실제 0A 출력이 2.5V라면 2048이 아니라 2.5V에 해당하는 ADC 값에서 빼야 합니다.

2.5V / 3.3V × 4095 ≈ 3102

즉, 실제 회로에서 0A일 때 ADC 값이 약 3102라면 다음과 같이 보정해야 합니다.

Ias_Offset = (Ias_Offset / 10) - 3102;

따라서 먼저 멀티미터로 0A 상태의 센서 출력 전압을 확인하고, 동시에 ADC 원시값을 출력해 보는 것이 정확합니다. 이 강의의 전류 측정 회로는 0A 기준점을 약 1.65V, 즉 ADC 값 약 2048에 맞춘 구성으로 설명되어 있으므로, 실제 보드의 회로 구성이나 전원·저항값이 다르다면 오프셋 값도 달라질 수 있습니다.

관련 내용은 아래 기존 질문과 답변을 참고해 주세요.

  • 전류 계산에 대한 질문입니다.
    ADC 원시값에서 오프셋을 제거하는 과정과 전류 센싱 회로의 기준 전압에 대해 설명되어 있습니다.
  • ABC 상전류 측정
    션트 저항을 이용한 상전류 측정 및 ADC 입력의 역할에 대해 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

C46~C48 크기

0

14

0

Teleplot 문의

0

42

1

MCU 선정 관련 문의

0

55

1

키트 구매 여부

0

62

3

소형모터 구동

0

44

2

stm 클럭설정

0

50

1

36. 전력은 900W가 될것 같습니다.

0

41

1

34.제너다이오드는 전류 분배기라고 생각하면 될까요 ?

0

38

0

33.제너다이오드와 tvs다이오드 모양이 동일합니다.

0

39

0

쓰로틀 V 변하지 않음

0

65

3

풀업 저항 크기와 커패시터 용량 선정 방법

0

60

2

86, data bit순서가 바뀌어야 할것 같습니다.

0

51

1

85. pwm사용에 기본구조 이해가 같이 요구되네요

0

52

1

dc모터 회전원리

0

55

2

83. volatile로 선언한 이유가 이해 안됩니다.

0

50

1

82. 16:50초 설명에 대한 오해 및 adc mode비교 자료

0

70

2

81. 소프트웨어 작성 방법론에 조언 부탁 드립니다.

0

69

2

00. stm32cubeIDE를 회사에서도 사용하나요 ?

0

58

1

상전류 읽는 타이밍 관련 문의

0

60

2

uart, tera term 실습이 잘 안됩니다.

0

73

3

80. 인터럽스와 일반함수 차이

0

56

1

79. int main(void)선언 없이 어떻게 동작하나요 ?

0

55

1

79. int main(void)선언 없이 어떻게 동작하나요 ?

0

38

1

74. 포인터 크기는얼마인가요 ?

0

49

1