본문 바로가기
Embedded/Raspberry PI

PWM 실습

by kjy1010 2024. 1. 3.

이번 포스팅에서는 라즈베리파이에서 PWM을 이용해 LED를 제어하는 실습을 진행하겠습니다.

 

회로도

 

 

PWM0은GPIO12,18을 PWM1은 GPIO13,19를 사용합니다.

위의 회로도에서는 PWM0을 사용하여 GPIO18 pin을 이용하여 실습을 진행하도록 하였습니다.

 

PWM device tree Overlay 설정

  • 라즈베리파이가 pwm sysfs interface 를 지원하도록 설정
  • 명령어 앞에 쉘 인터페이스 문자($, # 등) 는 쓰지 않는 것임
  • > 가 아니라 >>로 입력
  • 띄어쓰기 주의
$ sudo su
# echo dtoverlay=pwm >> /boot/config.txt
# reboot

 

  • 재부팅후 ls /sys/class/pwm/를 입력하였을때 pwmchip0이 보이지 않는다면 위의 과정을 다시 진행합니다.
  • /sys/class/pwm/pwmchip0 로 이동 후 LED를 제어해보겠습니다.

켜지는 지 확인해보았다면 pwmled.c 라는 c파일을 만들어 코드를 작성해보겠습니다.

#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>
#include <stdlib.h>
void ledPwmControl(int gpio)
{
    pinMode(gpio, OUTPUT); /* Pin의 출력 설정 */
    softPwmCreate(gpio, 0, 255); /* PWM의 범위 설정 */
    for(int i = 0; i < 10000; i++) 
    {
        softPwmWrite(gpio, i&255); /* PWM 값을 출력: LED 켜기 */
        delay(5);
    }
    softPwmWrite(gpio, 0); /* LED 끄기 */
}
int main(int argc, char **argv)
{
    int gno;
    if(argc < 2) 
    {
        printf("Usage : %s GPIO_NO\n", argv[0]);
        return -1;
    }
    gno = atoi(argv[1]);
    wiringPiSetup( ); /* wiringPi 초기화 */
    ledPwmControl(gno);
    return 0;
}

 

코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.

 

pi@raspberrypi:~ $ gcc -o pwmled pwmled.c -lwiringPi
pi@raspberrypi:~ $ sudo ./pwmled 1

 

위의 명령어를 통해 프로그램을 실행시켜 LED 밝기가 1분동안 점진적으로 변화하는 것을 확인 할 수 있습니다.

 

WiringPi 라이브러리 사용 이후에는 sysfs로 PWM이 제어되지 않는 오류가 있습니다.

  • WiringPi 내부에서 PWM 사용을 위한 resource cleanup이 제대로 되지 않는 것으로 추정
  • 다시 sysfs를 사용하기 위해서는 reboot 필요

'Embedded > Raspberry PI' 카테고리의 다른 글

OpenCV  (0) 2024.01.04
ADC with SPI  (4) 2024.01.03
Serial Interfaces  (2) 2023.12.28
Raspberry PI GPIO 실습(3)  (2) 2023.12.27
Raspberry PI GPIO 실습(2)  (0) 2023.12.22