UART I2C
정의 및
개념
1.     범용 비동기 수신 및 전송 (UART) 약자
2.     호스트가 보조 장치와 통신할 수 있도록하는 간단한 직렬 통신 프로토콜입니다.
3.     UART는 양방향, 비동기 및 직렬 데이터 전송을 지원합니다.
4.     두 개의 데이터 라인이 있습니다. 하나는 전송용(TX)이고 다른 하나는 수신용(RX)이며 디지털 핀 0, 디지털 핀 1을 통해 통신하는 데 사용됩니다.
5.     TX RX는 두 장치간에 연결됩니다. ( : USB 및 컴퓨터)
6.     UART는 컴퓨터와 외부 직렬 장치 간의 동기화 관리 문제도 처리할 수 ​​있습니다.
  1. I2C ( Inter-integrated-circuit) 약자
  2. UART와 유사한 직렬 통신 프로토콜이지만 PC 장치 통신에는 사용되지 않고 모듈 및 센서와 함께 사용됩니다.
  3. 단순한 양방향 2와이어 식 동기 직렬 버스이며 버스에 연결된 장치간에 정보를 전송하는 데 단일 line만 필요합니다.
  4. 명확한 통신 경로를 유지하면서 최대 128개의 장치를 메인 보드에 연결할 수 있으므로 함께 작동하는 다양한 부품 ( : 센서, , 확장 및 드라이버)이 필요한 프로젝트에 유용합니다!
  5. I2C는 주소 시스템과 공유 버스를 사용하기 때문에 동일한 와이어를 사용하여 많은 다른 장치를 연결할 수 있으며 모든 데이터가 단일 와이어로 전송되고 핀 수가 적습니다그러나 이 단순화된 배선의 단점은 SPI보다 느리다는 것입니다.
  6. I2C의 속도는 데이터 속도, 와이어 품질 및 외부 노이즈에 따라 달라집니다.
  7. I2C 프로토콜은 마이크로 컨트롤러, EEPROM, A/D D/A 컨버터, I/O 인터페이스 및 기타 유사한 주변 장치와 같은 저속 장치를 임베디드 시스템에 연결하기위한 2 와이어 인터페이스에도 사용됩니다.
작동 방식 1.      3 가지 방식으로 장치간에 작동 할 수 있습니다.
A.      Simplex = 한 방향으로 데이터 전송
B.      반이중 = 양방향으로 동시에 데이터 전송
C.      전이중 = 양방향으로 동시에 데이터 전송
2.      연결되면 데이터는 수신 UART TX에서 RX로 흐릅니다.
3.      UART는 비동기 직렬 전송이므로 클록 없음
4.      UART 전송은 마스터 장치 ( : CPU)의 병렬 데이터를 직렬 형식으로 변환하고 수신 UART에 직렬로 전송합니다그런 다음 직렬 데이터를 수신 장치의 병렬 데이터로 다시 변환합니다


5.      UART에는 클럭이 없으므로 UART는 전송중인 시작 및 중지 비트를 추가합니다.
6.      이것은 비트가 데이터 패킷의 시작과 끝을 나타내기 때문에 수신 UART가 비트 읽기를 시작할 시기를 알 수 있도록 도와줍니다수신 UART가 시작 비트를 감지하면 BAUD rate로 비트를 읽습니다.
7.      UART 데이터 전송 속도는 BAUD 속도라고하며 기본적으로 115,200으로 설정됩니다 (BAUD 속도는 심볼 전송 속도를 기반으로하지만 비트 속도와 유사 함).
8.      UART는 거의 동일한 전송 속도로 작동해야합니다. BAUD 속도의 차이가 10 % 이상이면 비트 타이밍이 꺼져있을 수 있으며 사용자는 UART가 동일한 데이터 패킷에서 송수신하도록 구성되어 있는지 확인해야합니다.
  1. SCL (시리얼 클럭 라인) SDA (시리얼 데이터 라인 수용 포트) 2개 라인이 있습니다.
  2. CL은 전송 동기화를 위한 클럭 라인입니다. SDA는 데이터 비트가 전송되거나 수신되는 데이터 라인입니다.
  3. 마스터 장치는 데이터의 버스 전송을 시작하고 전송된 장치를 열기위한 클록을 생성하며 주소가 지정된 모든 장치는 슬레이브 장치로 간주됩니다
  4. 버스에서 송수신하는 마스터와 슬레이브 장치 간의 관계는 일정하지 않습니다당시의 데이터 전송 방향에 따라 다릅니다
  5. 마스터가 데이터를 슬레이브로 보내려는 경우 마스터는 데이터를 보내기 전에 먼저 슬레이브에 주소를 지정해야 합니다.
  6. 마스터는 데이터 전송을 종료합니다마스터가 슬레이브로부터 데이터를 수신하려면 먼저 슬레이브에 주소를 지정해야 합니다
  7. 호스트는 슬레이브가 보낸 데이터를 수신하고 마지막으로 수신자는 수신 프로세스를 종료합니다호스트는 또한 타이밍 클럭을 생성하고 데이터 전송을 종료합니다.
  8. 또한 풀업 저항을 통해 전원 공급 장치를 연결해야 합니다버스가 유휴 상태 일 때 두 라인 모두 높은 전력 레벨에 있습니다
  9. 라인의 커패시턴스는 버스 전송 속도에 영향을 미칩니다버스의 전류 전력이 작기 때문에 커패시턴스가 너무 크면 전송 오류가 발생할 수 있습니다따라서 부하 용량은 400pF 여야하므로 버스의 허용 길이와 연결된 장치 수를 추정 할 수 있습니다.
 

 

장점
  1. 온라인에서 많은 리소스를 사용하여 널리 사용되는 방법이므로 작동이 간단하고 잘 문서화되어 있습니다.
  2. 클락이 필요하지 않습니다
  3. 오류 검사를 허용하는 패리티 비트
  1. 버스에 많은 장치가 있는 경우에도 핀/신호 수가 적습니다.
  2. 다중 마스터 및 다중 슬레이브 통신을 지원하므로 유연합니다.
  3. 2개의 양방향 와이어 만 사용하여 여러 장치 간의 통신을 설정하므로 간단합니다.
  4. 다양한 슬레이브 장치의 요구사항에 맞게 조정할 수 있습니다.
  5. 여러 마스터를 지원합니다.
단점
  1. 데이터 프레임의 크기는 9 비트로 만 제한됩니다.
  2. 여러 마스터 시스템 및 슬레이브를 사용할 수 없습니다.
  3. UART의 전송 속도는 데이터 손실을 방지하기 위해 서로 10 % 이내여야 합니다.
  4. 느린 속도
 
  1. SPI에서 사용하는 푸시 풀 저항이 아닌 풀업 저항이 필요하므로 속도가 느립니다또한 개방 드레인 설계 = 제한된 속도입니다.
  2. 저항기가 PCB 공간을 소비하므로 더 많은 공간이 필요합니다.
  3. 장치 수가 증가하면 복잡해질 수 있습니다.

'FW' 카테고리의 다른 글

Simplicity studio로 EFM8BB3 다루기_02  (0) 2023.11.01
Simplicity studio로 EFM8BB3 다루기  (2) 2023.11.01

 > ADC (joystick) test - UART 통신

 

-      EFM8BB3_ADC_Externalinput – Interrupts.c

-      표시된 부분은 화면으로 출력하겠다는 코드이기 때문에, UART 통신으로 화면 출력을 확인할 수 있다.

 

 

 > UART 통신으로 확인하기

 

-     시작버튼 우클릭 - 장치관리자 – serial 포트 – 포트확인

-     MobaXterm 실행 – Sessions – Serial - 포트 및 전송속도 설정 - OK

 

 

 

-      다음은 기본 값이 출력되는 화면이다.

 

-     다음은 조이스틱을 정면으로 눌렀을 때 출력 값이다. 정면으로 눌렀을 때의 값은 32mV라는 것을 알 수 있다.

 

'FW' 카테고리의 다른 글

UART와 I2C 비교 및 차이_01  (1) 2024.07.15
Simplicity studio로 EFM8BB3 다루기  (2) 2023.11.01

> Import하기

 

  -  File –> import

 

  - Browse -> Simplicity 폴더선택 –> Next –> Next -> Finish

 

-> 완성

 

 

 

 

 

 > 프로그램 테스트

 

 - 다운로드하기 ->  다음 버튼 클릭

Browse –> hex파일 경로 선택 –> Erase -> Program

 

 

 

 > Blinky LED 구현, 테스트하기

 

-      EFM8BB3_Blinky – src - Interrupts.c

 

-      LED0, LED1, LED2는 각각 P1.4, p1.5, p 1.6에 해당하는 것을 알 수 있다.

 

 

-      원하는 동작에 맞게 코드 작성

 

 

 

-     Compile : EFM8BB3_Blinky 오른쪽 마우스 – Clean project – Build project

 

또는

  표시된 부분 클릭

 

 

-     Program test

 

-      오실로스코프로 측정 – 표시된 부분을 통해 각각 확인할 수 있다.

 

->  LED가 출력됨에 따라 화면에도 high와 low가 출력된다.

'FW' 카테고리의 다른 글

UART와 I2C 비교 및 차이_01  (1) 2024.07.15
Simplicity studio로 EFM8BB3 다루기_02  (0) 2023.11.01

대표적으로는 부저(Buzzer)에서 사용

부저같은 경우는 펄스 폭을 ARR의 50%로만 유지하면 문제없음

  • while문으로 계속 실시간으로 바꾸다보면 갑자기 PWM신호의 출력이 없어져버리는 현상 : 펄스의 주기를 실시간으로 바꾸려면 ARR가 아닌 prescaler 을 통해 변경해야함

[기존]

84000000 / 168 / 1000 = 500 Hz 200 Hz 사이의 간격으로 하기위해서는

84000000 / 168 (고정) / x = 200 ⇒ x : 2500

PWM 출력이 갑자기 사라지는 (출력이 아예 없음) 경우가 있기 때문에 ARRegister 가 아닌 prescaler 레지스터를 접근하면서 실시간으로 변경해주면 됨

  • psc를 바꾸나 arr을 바꾸나 pwm 주기가 변하는 것은 똑같음 ⇒ ARR값의 의미만 조금 다를 뿐

'FW > STM32' 카테고리의 다른 글

06-2_PWM : PWM 신호이용 Application  (0) 2023.02.21
06-1_PWM : Timer 을 이용한 PWM  (1) 2023.02.21
05_EXTI (외부인터럽트)  (3) 2023.02.21
04_Timer_Interrupt  (1) 2023.02.21
03_Character_LCD  (1) 2023.02.21

 

1. 서브모터

[CubeMX]
TIM10 2채널 중 1번 채널 사용

 

pwm의 주기를 20ms로 만드는 방법 : 타이머의 주기 (168000000 / 내가 만들고자하는 pwm 펄스의 주기 (20ms의 경우 50 Hz이므로 50) ⇒ 결과값을 각 prescaler x Counter Period 의 형태로 만들어주기 ex) 168000000 / 50 =3360000 = 336 x 10000 ⇒ prescaler : 336 -1 , AAR(Counter Period) : 10000 - 1

[TrueStudio]

따라서, AAR은 10000이므로 만 번의 단계가 있는 것이고, 각 단계가 펄스 폭을 갖게될텐데 PWM 펄스의 폭을 구하려면 20ms을 10000단계로 나누면 → 1단계당 0.002, 우리가 원하는 것은 0.2이기 때문에 100을 곱해야함 ⇒ 펄스 폭은 100ms가 됨

0.2 ms (펄스폭 : 100) ⇒ cw 끝으로 이동 3ms (펄스폭 : 1500) ⇒ ccs 끝으로 이동

따라서 0.2ms~3ms 사이로 펄스 폭을 설정하면 그 사이에서 서브모터 컨트롤 가능

 

 

 

 

2. 부저 Buzzer

 

  • 능동형 : 전원을 인가하면 정해져있는 주파수에 비프음이 계속 나오는 부저
  • 수동형 passive : 입력된 신호의 주파수에 따라서 비프음이 나오는 부저

 

  • 펄스폭은 소리와 상관이 없지만 너무 작으면 비프음이 안들리는 경우가 있기 때문에 적절히 넣어준다

[CubeMX]

TIM2 4ch 중 1번 채널 사용

 

 

 

음계를 찍을 수도 있음

 

 

3. DC 모터

 

brushed DC모터 : 두 개의 핀, 각 핀이 순방향으로 전류가 흐르면 정회전, 역방향으로 전류가 흐르면 역방향 | 모터를 동작시키기 위해 PWM신호를 바로 모터로 연결하면 모터에서는 전력을 많이 소모하기 때문에 Pin 손상 또는 chip 이 죽을 수 있음 ⇒ 전력을 많이 소모하는 장치들은 장치에 드라이버를 달아서 사용함

입력 핀 2개 : STM에서 PWM 신호 연결

출력 핀 2개 : 모터로 연결

 

 

[CubeMX]

TIM5 4ch 중 1, 4번 채널 사용

'FW > STM32' 카테고리의 다른 글

06-3_PWM : 실시간 주기변경  (1) 2023.02.21
06-1_PWM : Timer 을 이용한 PWM  (1) 2023.02.21
05_EXTI (외부인터럽트)  (3) 2023.02.21
04_Timer_Interrupt  (1) 2023.02.21
03_Character_LCD  (1) 2023.02.21
  • 한 주기 내에서 펄스의 폭을 변경하면서 어떤 장치를 구동시킴
  • 요즘 사용되는 곳 : LED의 밝기나 모터의 회전 속도, 서브모터의 각도 등을 제어함
  • PWM : 펄스의 주기 + 한 주기 내에서의 펄스 폭 + 전압 레벨(MCU의 동작 전압) 로 정의

일반 MCU들처럼 STM 시리즈도 타이머를 이용해서 PWM신호를 만든다 ⇒ PWM신호의 주기나 펄스의 폭을 변경하기 쉽기 때문

PWM을 만들 때는 타이머 업데이트 인터럽트가 굳이 없어도 됨

한 주기 안에서 펄스의 폭을 조절할 수 있어야함 ⇒ Capture Compare Register 사용 CCRegister → 0 ~ AAR (Auto Reload Register) 값 까지

[사진 1]

Auto Reload Register 의 값에 따라 한 주기가 이루어짐, Capture Compare Register 의 값이 정해지면 해당 값 까지만 올라가다가 남은 주기는 low로 떨어져있고, 한 주기가 다시 시작 될 때 다시 올라감

 

즉, PWM 펄스의 주기는 AAR, Prescaler, Timer(APB1/APB2) 에 따라 정해짐

그 주기 안에서 PWM 펄스 폭은 Capture Compare Register 를 통해 설정

채널의 개수 - 각 채널에 대한 CCR도 1:1로 존재하기 때문에 CCR의 개수로도 볼 수 있으며, 그 CCR의 개수만큼 독립적으로 타이머를 제어할 수 있음

이전에는 Prescaler 와 AAR이 반비례하고, 최종 값만 일치하면 상관없다했는데, PWM에서는 이야기가 달라짐 CCR의 값이 너무 낮으면 불안정함, 어느 정도 값을 높여서 설정해주는 것이 좋음

 

 

=======================실습============================

CudeMX에서 변경한 사항 : 기존에 LED GPIO output 이던 부분을 TIM3, TIM4 ch로 변경

  1. MX_TIM3_Init

주기설정 부분 :

 

 

 

 

 

 

펄스폭설정 부분: 

 

위상 설정 : PWM 폭 형태(high/low)를 반전시켜서 출력할 수도 있음 옵션에 따라

1 또는 2 변경

[Code]

  • Drivers/Src/stm32f4xx_hal_tim.c
    1. HAL_TIM_PWM_Start() 함수를 main.c 에서 호출

[표 1]

 

 

[표 2]

각 타이머마다 PWM 출력채널로 사용할 수 있는 핀들이 정리되어있는 표

'FW > STM32' 카테고리의 다른 글

06-3_PWM : 실시간 주기변경  (1) 2023.02.21
06-2_PWM : PWM 신호이용 Application  (0) 2023.02.21
05_EXTI (외부인터럽트)  (3) 2023.02.21
04_Timer_Interrupt  (1) 2023.02.21
03_Character_LCD  (1) 2023.02.21

+ Recent posts