[SigmaStar SSD202] GPIO口模拟输出PWM信号

【SigmaStar SSD202】 GPIO口模拟输出PWM信号

一、PWM0输出配置

1、在 source_code/kernel/arch/arm/boot/dts/infinity2m-ssc011a-s01a.dtsi 中加入:

	pwm {
	    compatible = "sstar,infinity-pwm";
	    reg = <0x1F003400 0x600>;
	    clocks = <&CLK_xtali_12m>;
	    npwm = <2>; //代表下面的pad-ctrl有2个
	    pad-ctrl = <PAD_GPIO4 PAD_GPIO5>; // 这里PAD_GPIO4对应PWM0,PAD_GPIO5对应PWM1
	    status = "ok"; 
	};

2、在 source_code/kernel/arch/arm/boot/dts/infinity2m-ssc011a-s01a-padmux.dtsi中修改:

    <PAD_GPIO4 PINMUX_FOR_PWM0_MODE_3 MDRV_PUSE_PWM0 ><PAD_GPIO5 PINMUX_FOR_PWM1_MODE_4 MDRV_PUSE_PWM1 >

ps:然后把 PINMUX_FOR_EJ_MODE_x 模式的几个注释掉,即 PAD_GPIO4-7。同理,对infinity2m-ssc011a-s01a-padmux-display.dtsi做同样的修改!!!

【注】待烧录后可以通过 echo 4 > /sys/class/gpio/export 的方式查看是否配置成功:
如果配置成功只会打印PWM0_MODE_3模式,如果出现PINMUX_FOR_EJ_MODE模式则配置失败。

3、编译kernel前,make menuconfig进去后,进入Device Driver/SStar Soc platform drivers

按空格修改 <> SSTAR_PWM 为 <*> SSTAR_PWM 并保存编译

4、操作步骤:

    设置PWM0:echo 0 > /sys/class/pwm/pwmchip0/export
    设置频率:echo 100 > /sys/class/pwm/pwmchip0/pwm0/period
    设置占空比:echo 30 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
    设置极性:echo normal或inverse > /sys/class/pwm/pwmchip0/pwm0/polarity
    设置使能:echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable

ps:如果是normal,那么duty_cycle=25%,表示高电平占的比例是25%,否则反之。

配置完后,用示波器可以测量到下图波形。
在这里插入图片描述

二、GPIO口模拟波形

通过preject的代码实现模拟的话,应选择用户方式去打开GPIO口,这里无法通过调用 gpio_set_value()等函数。

// 通过GPIO10模拟输出PWM波形: f=100, T=10ms, duty=30%
void Gpio2Pwm(void)
{
    int i = 0;
    
    system("echo 10 > /sys/class/gpio/export ");
    system("echo out > /sys/class/gpio/gpio10/direction"); // 设置IO口为输出
    
    while(1){
        	// 通过用户使用IO口的方式拉gpio10口
    	system("echo 1 > /sys/class/gpio/gpio10/value");
    	// 增加延时。system语句和for循环共延时3ms
     	for(i=0; i<23045; i++){
    		; // 空语句
    	}
     
      	// 通过用户使用IO口的方式拉gpio10口
  		system("echo 0 > /sys/class/gpio/gpio10/value");
    	// 增加延时。system语句和for循环共延时7ms
     	for(i=0; i<516445; i++){
    		; // 空语句
    	}
     }
}

【注1】通过 system() 去拉IO的方式比较耗时间,我试了一下大概需要2.8ms左右,所以这种方式无法实现非常高频率的 PWM 波形。
ps:换而言之,如果需要获得更高频率的 PWM 波,需要通过配置 kernel 的方式实现。

【注2】当我们要设置想要的频率时,可通过占空比计算高低电平的时间。
ps:我这里设置的是 f=100, T=10ms, duty=30%,也就是高电平3ms,电平7ms。

通过示波器的波形图,可以看出PWM波形的是一样的效果。
在这里插入图片描述


以上。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPIO模拟PWM(脉冲宽度调制)是一种通过在GPIO引脚上快速切换电平来模拟PWM信号的方法。在某些单片机或嵌入式系统中,可能没有硬件支持的PWM功能,但可以使用GPIO来实现类似的效果。 要在GPIO模拟PWM,你可以按照以下步骤进行操作: 1. 选择一个合适的GPIO引脚作为输出引脚。 2. 使用编程语言(如Python或C)来控制GPIO引脚的电平。 3. 通过控制GPIO引脚的电平持续时间来模拟PWM信号的占空比。 4. 使用一个循环或定时器来控制PWM信号的频率。 下面是一个使用Python进行GPIO模拟PWM的示例代码: ```python import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) pwm = GPIO.PWM(18, 100) # 设置频率为100Hz pwm.start(50) # 设置初始占空比为50% try: while True: # 改变占空比 for duty_cycle in range(0, 101, 5): pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.1) for duty_cycle in range(100, -1, -5): pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.1) except KeyboardInterrupt: pass pwm.stop() GPIO.cleanup() ``` 以上代码使用RPi.GPIO库来控制树莓派的GPIO引脚。通过改变`ChangeDutyCycle()`函数的参数,可以改变PWM信号的占空比。循环部分可以让PWM信号在0%到100%之间循环变化。 请注意,GPIO模拟PWM的精度可能不如硬件PWM,并且频率也会受到系统性能的限制。因此,对于需要高精度和稳定性的应用,建议使用支持硬件PWM的设备或模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值