mini2440驱动学习第五课————PWM

    转眼间,已到了mini2440厂家友善所提供驱动的最后一课——PWM。本驱动用定时器0产生PWM脉冲信号,GPB0管脚输出接蜂鸣器。贴出代码如下:

 

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>

 

#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <plat/regs-timer.h>
#include <mach/regs-irq.h>
#include <asm/mach/time.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

 

#define DEVICE_NAME     "pwm"                  //设备名

 

#define PWM_IOCTL_SET_FREQ  1               //宏变量,用于ioctl的cmd变量
#define PWM_IOCTL_STOP   0

 

static struct semaphore lock;                      //定义信号量 lock

 

/* freq:  pclk/50/16/65536 ~ pclk/50/16
  * if pclk = 50MHz, freq is 1Hz to 62500Hz
  * human ear : 20Hz~ 20000Hz
  */
st

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴听到您的学习历程,关于 PWM 脉冲宽度调制,我可以为您提供一些补充。 除了使用计数器和比较器的方法,还可以使用 FPGA 内部的 DDS(Direct Digital Synthesis)模块来实现 PWM 信号的生成。DDS 模块可以直接生成正弦波等连续信号,也可以通过修改相位和幅度控制信号的形态。 下面是一个使用 DDS 模块实现 PWM 的例子: ``` module pwm( input clk, input rst, input [7:0] duty_cycle, output reg pwm_out ); reg [31:0] phase_acc; // 相位累加器 reg [7:0] phase_inc; // 相位增量 // 相位增量为占空比的倒数 always @(*) begin phase_inc = 256 / duty_cycle; end // 相位累加器每个时钟周期加上相位增量 always @(posedge clk) begin if (rst) begin phase_acc <= 0; pwm_out <= 0; end else begin phase_acc <= phase_acc + phase_inc; if (phase_acc >= 2**32) begin phase_acc <= 0; end if (phase_acc[31]) begin pwm_out <= 1; end else begin pwm_out <= 0; end end end endmodule ``` 在这个代码中,我们使用了一个 32 位的相位累加器 phase_acc 和一个 8 位的 phase_inc 来控制 PWM 信号的生成。相位累加器每个时钟周期加上相位增量,当相位累加器的最高位为 1 时,PWM 输出为高电平。 相比使用计数器和比较器的方法,使用 DDS 模块可以更加灵活地控制 PWM 信号的形态和频率。但是,DDS 模块的实现需要占用 FPGA 的资源,需要根据具体应用场景进行选择。 希望这个回答能够为您提供一些参考。如果您有其他问题,可以随时问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值