PWM

EEEFFEE·2024년 1월 10일
0

임베디드 리눅스

목록 보기
12/14

24.01.10

1. PWM

  • 디지털 신호를 통해 아날로그 신호와 유사한 신호를 생성하는 방법

  • 일정한 주기의 디지털 신호의 출력이 HIGH인 시간과 LOW인 시간의 비율 조정
    (Period + Duty Cycle)

  • 나타내는 방법

    • Period : HIGH(LOW)에서 다음 HIGH(LOW)가 될 때 까지 걸리는 시간
    • Duty Cycle : Period 중 HIGH인 시간의 비율을 나타냄

예제

GPIO 핀을 PWM 핀으로 세팅

  • GPIO 12, 13번의 경우 FSEL 레지스터의 비트를 Alternate function 0이 되도록 세팅하면 PWM을 위한 핀이 됨
  • GPIO 18, 19번의 경우 FSEL 레지스터의 비트를 Alternate function 5가 되도록 세팅하면 PWM을 위한 핀이 됨

PWM Control & Status Register

코드

등록해제
k_module_init()k_module_exit()
  • k_module_init() : pwm0를 할당받고 pwm의 HIGH 유지시간 설정, pwm 작동
  • k_module_exit() : pwm0off 및 pwm0해제

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pwm.h>

struct pwm_device *pwm0 = NULL;
u32 pwm_on_time = 900000;

static int __init k_module_init(void)
{
	int retval;

	pr_info("k 커널 모듈 \n");

	pwm0 = pwm_request(0, "my-pwm");
	if(pwm0 == NULL) {
		printk("Could not get PWM0!\n");
		return -1;
	}

	pwm_config(pwm0, pwm_on_time, 1000000);
	pwm_enable(pwm0);
	return 0;
}

static void __exit k_module_exit(void)
{
	pwm_disable(pwm0);
	pwm_free(pwm0);

	pr_info("바이!!n");
}

module_init(k_module_init);
module_exit(k_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("K <k@k.com>");
MODULE_DESCRIPTION("k initial module");
MODULE_VERSION("1.0.0");

0개의 댓글

관련 채용 정보