PWM子系统

实现用PWM子系统控制风扇、蜂鸣器、马达的速率

一、PWM子系统框架

二、电路连接

(一)蜂鸣器

在这里插入图片描述
由图可知,使用了定时器4的通道1,该引脚连到了主控板的PB6引脚

在这里插入图片描述

(二)风扇

在这里插入图片描述
使用了定时器1的通道1,连接了PE9引脚
在这里插入图片描述

(三)马达

在这里插入图片描述
连接引脚PF6

在这里插入图片描述

三、配置内核

  1. 开启STM32定时器

     Device Drivers --->
     	Multifunction device drivers --->
     		{*} Support for STM32 Timers 
    
  2. 开启STM32 PWM控制器

     Device Drivers --->
     	[*] Pulse-Width Modulation (PWM) Support --->
     		<*> STMicroelectronics STM32 PWM
     		<*> STMicroelectronics STM32 PWM LP
    
  3. 开启基于PWM⼦系统的pwm-beeper驱动
    如果不使用内核自带的pwm-beeper驱动,该配置不要选配,选n

     Device Drivers --->
     	Input device support --->
     		[*] Miscellaneous devices --->
     			<*> PWM beeper support 
    

四、设备树

(一)timer定时器

打开stm32mp151.dtsi文件,找到timers4节点

timers4: timer@40002000 {
   
			#address-cells = <1>;
			#size-cells = <0>;
			compatible = "st,stm32-timers";
			reg = <0x40002000 0x400>;
			clocks = <&rcc TIM4_K>;
			clock-names = "int";
			dmas = <&dmamux1 29 0x400 0x80000001>,
			       <&dmamux1 30 0x400 0x80000001>,
			       <&dmamux1 31 0x400 0x80000001>,
			       <&dmamux1 32 0x400 0x80000001>;
			dma-names = "ch1", "ch2", "ch3", "ch4";
			status = "disabled";
		};

打开内核帮助文档,找到相关示例
st,stm32-timer.yaml

36 examples:
 37   - |
 38     #include <dt-bindings/interrupt-controller/arm-gic.h>
 39     #include <dt-bindings/clock/stm32mp1-clks.h>
 40     timer: timer@40000c00 {
   
 41         compatible = "st,stm32-timer";
 42         reg = <0x40000c00 0x400>;
 43         interrupts = <50>;                                                       
 44         clocks = <&clk_pmtr1>;
 45     };

对比可见,定时器基本配置已经配置完毕。因此只需要配置相关的引脚控制。
定时器4节点

&timers4 {
   
	/delete-property/dmas;
	/delete-property/dma-names;
	status = "okay";
	pwm4: pwm {
   
		pinctrl-0 = <&pwm4_pins_c>;
		pinctrl-1 = <&pwm4_sleep_pins_c>;
		pinctrl-names = "default", "sleep";
		#pwm-cells = <2>;
		status = "okay";
	};
	timer@3 {
   
		status = "disabled";
	};
};

引脚配置
pinmux 用于配置引脚复用功能
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可见,TIM4的通道1功能,需要将PB6引脚配置为AF2
同理,TIM1_CH1,需要将PE9复用为AF1
TIM16_CH1,需要将PF6复用为AF1

&pinctrl {
   
	pwm4_pins_c: pwm4-0 {
   
		pins {
   
			pinmux = <STM32_PINMUX('B', 6, AF2)>;
			/* TIM4_CH1 */
			bias-pull-down;  	//下拉
			drive-push-pull;	//推挽
			slew-rate = <0>;
		};
	};
	pwm4_sleep_pins_c: pwm4-sleep-0 {
   
		pins {
   
		pinmux = <STM32_PINMUX('B', 6, ANALOG)>; /* TIM4_CH1 */
		};
	};
};

(二)PWM

然后打开PWM的帮助文档
pwm.txt ---- 介绍用户节点
pwm.yaml ---- 介绍控制器节点

在pwm.txt中可以获得关于pwm用户节点的介绍:
#pwm-cells = <2>;
使用两个元素来描述PWM设备
第一个元素描述PWM通道号,0表示使用PWM控制器的第一个通道。
第二个元素描述PWM频率,单位是赫兹(Hz)

pwms:这是一个必需的属性,用于列出设备将要使用的PWM设备。它的值是一个或多个pwm-list结构
pwm-list属性的列表来指定想要使用的PWM设备

蜂鸣器节点

/{
   
	//蜂鸣器
	beeper {
   
		compatible = "pwm-beeper"
根据提供的引用内容,我无法找到关于Linux PWM子系统的reload操作的具体信息。但是,我可以为您提供一些关于Linux PWM子系统的基本介绍和操作方法。 Linux PWM子系统是用于控制嵌入式系统中的脉冲宽度调制(PWM)信号的一个子系统。它允许用户通过软件来生成和控制PWM信号,用于控制各种外设,如LED灯、电机等。 要使用Linux PWM子系统,您需要进行以下步骤: 1. 确保您的系统已经加载了PWM驱动程序。您可以通过运行以下命令来检查: ```shell ls /sys/class/pwm/ ``` 如果该目录存在,则表示PWM驱动程序已加载。 2. 找到您想要使用的PWM通道。PWM通道通常在/sys/class/pwm/目录下以pwmchipX的形式表示,其中X是通道的编号。您可以运行以下命令来查看可用的PWM通道: ```shell ls /sys/class/pwm/ ``` 3. 配置PWM通道的属性。您可以通过修改/sys/class/pwm/pwmchipX/pwmY/目录下的相应属性文件来配置PWM通道的参数,其中X是PWM通道的编号,Y是具体通道的编号。例如,您可以通过修改/sys/class/pwm/pwmchip0/pwm0/目录下的duty_cycle文件来设置PWM信号的占空比。 4. 启动PWM信号。您可以通过将1写入/sys/class/pwm/pwmchipX/pwmY/enable文件来启动PWM信号,其中X是PWM通道的编号,Y是具体通道的编号。例如,您可以运行以下命令来启动PWM信号: ```shell echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable ``` 请注意,具体的PWM子系统操作可能因不同的硬件平台和Linux内核版本而有所差异。因此,我建议您查阅相关的文档和资料以获取更详细和准确的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值