【Allwinner ClassA20类库分析】5.PWM类的使用

     这一节讲述PWM类的使用方法,请先在 https://github.com/tjCFeng/ClassA20 下载ClassA20类库。

    

    PWM,又一个典型的输出功能,是利用处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它主要包括周期、脉冲宽度和占空比这几个概念。脉冲宽度就是高电平输出的时间,占空比就是低电平所占的百分比。而高电平与低电平时间的总和就是周期,所以我们主要设置脉冲宽度和占空比这两个数值(当然,一些基本的设置已经被封装好或使用默认值)。

    

    还是先来看一下类的定义,请打开PWM单元文件:


    与GPIO单元类似,同样有两个类供使用。但是这里面有一些不同,先说说TPWM类。

    

    TPWM类的使用方法和TGPIO相同,直接创建就可以用了,但是它的实现方式不一样。PWM口与IO口是复用的,它是IO口的另一种功能,所以TPWM类继承了TGPIO类。继承后的TPWM类在内部调用了TGPIO类的一些功能设置对应的IO口为PWM输出,同时设置好了一些基本的属性,所以在使用时不需要考虑的太多。

    

    而TPWMGROUP类就不同了,它是一个单例类,即在同一个程序中它只能被创建一次,而且是第一次使用时被创建,再在其他任何地方使用都是这个已经创建好的实例,而且不需要手动释放,在程序退出时自动释放。这样做是为了尽量避免多处程序对一个PWM通道操作造成影响。当然,完全避免是不可能的(除非加锁,但是这样对操作系统的依赖比较大),主要还是起到提示作用。

    

    好了,开始动手吧,自制神器再次出现


    请忽略上面的各种按键,只看LED。和上一节香蕉派上的PH24不一样,这个LED通过一个三极管来驱动,它可以根据PWM的频率来亮灭。当PWM输出低电平时形成压差使LED亮,高电平时灭。

    

    硬件的连接,由于是自制的,不具有通用性,所以不再表述,只看PWM这根线,出于方便,我把它接在了PWM1上,也就是PI3这个IO口(紫色的那根线)。


    

    准备工作完成,开始写程序。


    pascal的with可以省略对象名,真正操作就是指定PWM通道,设置预分频、周期、占空比。更改后面这三个可以看到LED闪烁频率的变化。

    闪烁的过程是动态的,就不拍照了,拍了也看不出效果:-)。

    

    再看看TPWMGROUP类的使用方法,实现了和上面完全一样的效果,但是代码是要这样写地:


    代码量一下增加了好多,但是使用起来更加灵活,根据自己的需要来决定。

    有兴趣的话可以试试电机的控制或实现一个呼吸灯吧。

    

    请在https://github.com/tjCFeng/ClassA20下载ClassA20类库。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能强大,直接虐死wiringPi的树莓派IO之pascal代码,包括GPIO,I2C,PWM等控制。 rpi_hal-Hardware Abstraction Library (GPIO, I2C and SPI functions and procedures) This Unit with around 1700 Lines of Code provided by Stefan Fischer, delivers procedures and functions to access the rpi HW I2C, SPI and GPIO: Just an excerpt of the available functions and procedures: procedure gpio_set_pin (pin:longword;highlevel:boolean); { Set RPi GPIO pin to high or low level; Speed @ 700MHz -> 0.65MHz } function gpio_get_PIN (pin:longword):boolean; { Get RPi GPIO pin Level is true when Pin level is '1'; false when '0'; Speed @ 700MHz -> 1.17MHz } procedure gpio_set_input (pin:longword); { Set RPi GPIO pin to input direction } procedure gpio_set_output(pin:longword); { Set RPi GPIO pin to output direction } procedure gpio_set_alt (pin,altfunc:longword); { Set RPi GPIO pin to alternate function nr. 0..5 } procedure gpio_set_gppud (mask:longword); { set RPi GPIO Pull-up/down Register (GPPUD) with mask } ... function rpi_snr :string; { delivers SNR: 0000000012345678 } function rpi_hw :string; { delivers Processor Type: BCM2708 } function rpi_proc:string; { ARMv6-compatible processor rev 7 (v6l) } ... function i2c_bus_write(baseadr,reg:word; var data:databuf_t; lgt:byte; testnr:integer) : integer; function i2c_bus_read (baseadr,reg:word; var data:databuf_t; lgt:byte; testnr:integer) : integer; function i2c_string_read(baseadr,reg:word; var data:databuf_t; lgt:byte; testnr:integer) : string; function i2c_string_write(baseadr,reg:word; s:string; testnr:integer) : integer; ... procedure SPI_Write(devnum:byte; reg,data:word); function SPI_Read(devnum:byte; reg:word) : byte; procedure SPI_BurstRead2Buffer (devnum,start_reg:byte; xferlen:longword); procedure SPI_BurstWriteBuffer (devnum,start_reg:byte; xferlen:longword); { Write 'len' Bytes from Buffer SPI Dev startig at address 'reg' }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值