PWM 기타

PWM은 Pulse Width Modulation의 약어로, 디지털 시스템에서 아날로그 회로나 전원 공급 장치를 제어하는 ​​데 일반적으로 사용되는 기술입니다. 기본 원리는 일련의 구형파의 높은 수준의 시간 폭을 제어하여 아날로그 신호 등의 미세한 제어를 달성하는 것입니다. 다음은 PWM의 기본 작업 흐름에 대한 간략한 소개입니다.

  1. PWM 신호는 주기적이며 고정된 주기를 갖습니다. 각 사이클에서 PWM 신호는 먼저 하이 레벨에서 시작하고 일정 시간이 지나면 다음 사이클까지 로우 레벨로 전환됩니다.

  2. 이 최고 시간(펄스 폭이라고 함)을 변경할 수 있습니다. 펄스 폭이 증가하면 PWM 신호는 오랫동안 높게 유지되고, 반대로 펄스 폭이 감소하면 PWM 신호는 더 짧은 시간 동안 높게 유지됩니다.

  3. 일정 기간 동안 PWM 신호의 평균 전압을 측정하면 기본적으로 전체 기간 중 높은 시간의 비율에 비례한다는 것을 알 수 있습니다. 이것을 듀티 사이클이라고 합니다. 듀티 사이클이 100%이면 PWM 신호는 항상 하이 레벨로 유지되고, 듀티 사이클이 0%이면 PWM 신호는 항상 로우 레벨로 유지됩니다.

  4. 듀티 사이클을 조정하면 모터 속도, LED 밝기 등 장치에 공급되는 전원을 매우 정밀하게 제어할 수 있습니다.

일반적으로 PWM은 고레벨과 저레벨의 시간 비율을 조절하여 전기기기의 동작상태를 제어한다. 이 기술은 전기 공학의 다양한 분야에서 널리 사용됩니다.

Linux 커널에서 장치 트리는 서로 다른 장치 간의 연결과 해당 구성 매개변수를 포함하여 하드웨어 아키텍처를 설명하는 데 사용됩니다. 커널에 이미 PWM 드라이버 코드가 있지만 장치 트리에 해당 구성이 없는 경우 장치 트리 소스 파일에 해당 노드를 추가해야 합니다. 다음은 PWM 컨트롤러용 장치 노드를 구성하는 기본 장치 트리 노드 구성 예입니다.

pwm0: pwm@01c21000 {
    compatible = "allwinner,sun4i-a10-pwm";
    reg = <0x01c21000 0x20>;
    clocks = <&osc24M>;
    #pwm-cells = <3>;
    status = "okay";
};

위의 예에서 compatible필드는 이 장치를 구동하는 데 어떤 드라이버를 사용해야 하는지 커널에 알려줍니다. reg필드에는 PWM 컨트롤러의 물리적 메모리 주소가 포함됩니다. clocks필드는 이 PWM 장치가 참조하는 클록 소스이며, #pwm-cells = <3>;이는 이 PWM 컨트롤러가 3개의 PWM 채널을 제어할 수 있음을 나타냅니다. status = "okay"장치를 활성화하십시오.

특정 하드웨어 및 커널 버전의 경우 PWM 컨트롤러 제조업체의 데이터 시트, Linux 커널 소스 코드 및 설명서를 참조하여 장치 트리 노드를 올바르게 구성해야 합니다. 예를 들어, 일부 PWM 컨트롤러는 입력 클록 주파수(clocks), 채널 수( #pwm-cells), 인터럽트(지원되는 경우) 등과 같은 다른 속성 필드를 추가해야 할 수 있습니다.

구성이 완료된 후 dtc(장치 트리 컴파일러)를 사용하여 장치 트리 소스 파일(확장 포함)을 장치 트리 바이너리 파일( 확장 포함)로 컴파일한 다음 이 파일을 커널에 전달하여 구성해야 .dts합니다 . 장치..dtb.dtb

PWM(펄스 폭 변조) 구동에서 채널은 일반적으로 단일 PWM 출력 신호를 나타냅니다. PWM 컨트롤러(드라이버) 장치에는 하나 이상의 채널이 있을 수 있으며, 각 채널은 독립적으로 PWM 출력 신호를 생성할 수 있습니다. 각 PWM 채널에는 일반적으로 자체적인 독립적인 듀티 사이클 및 주파수 제어 설정이 있습니다. 듀티 사이클은 전체 사이클 시간에 대한 PWM 사이클의 하이 레벨 상태 비율을 의미합니다. 이 비율은 소프트웨어로 제어하여 PWM 신호의 모양을 제어할 수 있으며, 주파수는 PWM 사이클의 길이를 결정합니다.

따라서 동일한 PWM 컨트롤러 장치의 서로 다른 채널을 독립적으로 제어하여 서로 다른 PWM 신호를 출력할 수 있습니다. 예를 들어, 임베디드 시스템에서 흔히 볼 수 있는 LED 백라이트 제어, DC 모터 제어, 사운드 생성 등은 모두 PWM 컨트롤러의 하나 이상의 채널을 사용하여 구현할 수 있습니다.

PWM 컨트롤러의 채널 수는 하드웨어에 따라 다릅니다. 일부 간단한 컨트롤러에는 채널이 하나만 있을 수 있지만 고급 컨트롤러에는 수십 개의 채널이 있을 수 있습니다. 어떤 컨트롤러를 선택하는지는 특정 애플리케이션의 요구 사항에 따라 다릅니다. 예를 들어 여러 LED 조명을 독립적으로 제어해야 하거나 여러 모터를 동시에 제어해야 하는 애플리케이션의 경우 여러 채널이 있는 PWM 컨트롤러가 유용합니다. 각 채널은 독립적인 PWM 파형을 생성할 수 있으며 듀티 사이클과 주파수를 독립적으로 조정할 수 있습니다. 이를 통해 각 LED 또는 모터는 독립적인 밝기 또는 속도 제어를 가질 수 있습니다.

STM32 시리즈와 같은 일반적인 마이크로 컨트롤러에는 여러 타이머 장치가 있을 수 있으며 각 타이머는 하나 이상의 PWM 채널을 제공할 수 있습니다. 예를 들어 STM32F103 타이머 시리즈는 일반적으로 최대 4개의 PWM 채널을 제공합니다.

또 다른 예는 GPIO 인터페이스가 1-2 PWM 채널의 출력을 지원하는 Raspberry Pi와 같은 임베디드 개발을 위한 일부 일반적인 Linux 하드웨어입니다.

일반적으로 PWM 컨트롤러에 포함된 PWM 채널 수는 주로 특정 하드웨어 설계 및 애플리케이션 요구 사항에 따라 달라집니다. 특정 정보는 관련 하드웨어의 데이터 시트 및 기술 사양을 참조해야 합니다.

PWM(Pulse Width Modulation)이라는 용어에서 "invert"는 일반적으로 PWM 신호를 반전시키는 것을 의미합니다. 즉, 원래의 높은 레벨을 낮은 레벨로, 원래의 낮은 레벨을 높은 레벨로 플랫하게 변경하는 것입니다. 표준 PWM 신호에서 듀티 사이클은 PWM 사이클 동안 신호가 높은 시간의 비율을 정의합니다. 예를 들어, PWM 신호의 듀티 사이클이 75%인 경우 신호는 각 PWM 사이클 동안 75% 동안 하이 상태가 됩니다.

이 PWM 신호가 반전되면 각 PWM 사이클에서 신호는 시간의 75% 동안 로우 레벨이 되고 나머지 25%의 시간 동안 하이 레벨이 됩니다.

이 "반전" 기능은 많은 PWM 응용 분야에서 사용됩니다. 어떤 상황에서는 장치가 낮은 수준의 PWM 신호에 민감할 수 있고 다른 상황에서는 장치가 높은 수준에 민감할 수 있기 때문입니다. 따라서 "인버트" 기능을 사용하여 장치가 PWM 신호의 하이 기간 또는 로우 기간 동안 작동하는지 여부를 제어할 수 있습니다.

PWM(펄스 폭 변조)의 듀티 사이클 및 주파수 매개변수는 일반적으로 드라이버 코드에 하드 코딩되어 있지 않습니다. 이러한 매개변수는 일반적으로 다양한 애플리케이션 요구 사항을 충족하기 위해 런타임 시 동적으로 설정되어야 합니다. 예를 들어 LED 조명의 밝기를 제어하고 DC 모터의 속도를 제어하는 ​​등의 작업을 수행합니다. 드라이버 코드의 주요 작업은 이러한 매개 변수를 설정하는 기능을 구현하고 호출할 애플리케이션이나 기타 커널 구성 요소에 대한 인터페이스를 제공하는 것입니다. 커널 공간에서 드라이버는 일반적으로 PWM API를 통해 이러한 기능을 구현합니다. 예를 들어, pwm_config()함수를 사용하여 PWM의 주기와 듀티 사이클을 설정할 수 pwm_enable()있으며 , pwm_disable()함수를 사용하여 PWM 출력을 활성화 및 비활성화할 수 있습니다.

사용자 공간에서 PWM 매개변수는 일반적으로 sysfs 인터페이스를 통해 동적으로 구성될 수 있습니다. 예를 들어, 파일 내용을 /sys/class/pwm/pwmchipX/pwmY/period수정 하여 PWM의 주파수와 듀티 사이클을 변경할 수 있습니다 ./sys/class/pwm/pwmchipX/pwmY/duty_cycle

따라서 PWM의 듀티 사이클과 주파수는 동적으로 조정될 수 있으며 드라이버에 하드 코딩되지 않습니다.

おすすめ

転載: blog.csdn.net/qq_41483419/article/details/133347739