新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机驱动CPLD的PWM正弦信号发生器设计

单片机驱动CPLD的PWM正弦信号发生器设计

作者:时间:2013-02-06来源:网络收藏

下面用硬件描述语言来设计CPLD 的内部电路,这里给出VerilogHDL 版本的参考代码。

  module Mini51b_(P0,ALE,P27,WR,);// 模块电路命名和端口说明。

  input [7:0]P0;// 数据输入接MCU 数据P0 口

  input ALE,P27,WR;// 几个MCU 读写控制引脚

  output ;//PWM 信号输出

  wire [7:0]addr;// 内部地址线

  reg [7:0]daPWMc,daPWMs;// 定义计数器和占空比设定寄存器

  reg [3:0]divPWM,divPWMc;// 分频控制变量

  reg PWM;// 输出锁存器

  assign addr = ALE?P0 : addr; // 低八位地址锁存

  always @(negedge WR)// 在MCU 写信号有效时执行寄存器设定

  begin

  case({P27,addr[4:0]}) // 根据地址选择寄存器

  6'b10_1000: daPWMs = P0;// 写带地址的寄存器

  6'b10_1001: divPWM = P0[3:0];// 写带地址的寄存器

  default:begin// 其它地址则让寄存器保持不变

  daPWMs = daPWMs;

  divPWM = divPWM;

  end

  endcase

  end

  always @(posedge ALE) begin// 这里利用MCU 的ALE 做时钟信号

  if(divPWMc == divPWM) begin // 与分频系数比较

  divPWMc=0;

  if(daPWMc100) daPWMc = daPWMc+1; //PWM 调整精度1%

  else daPWMc = 0;

  if(daPWMs daPWMc) PWM = 0;//PWM 发生器

  else PWM = 1;

  end

  else divPWMc = divPWMc+1;// 时钟分频

  end

  endmodule

  关于单片机与CPLD 之间的接口请读者参考本刊前几期笔者撰写的文章。

  与之对应的MCU 测试程序为:

  #include reg51.h>

  #include absacc.h>

  #define PWM XBYTE[0xffe8]

  #define DIV XBYTE[0xffe9]

  void main()

  {

  DIV = 15; //PWM 信号频率计算晶振22.1184M/6/100/

  (DIV+1)=2.30K(实测2.281K)

  PWM=50; // 设定占空比50%,前面计数器范围为0~99

  while(1) ;

  }

pwm相关文章:pwm原理


负离子发生器相关文章:负离子发生器原理
分频器相关文章:分频器原理
尘埃粒子计数器相关文章:尘埃粒子计数器原理
脉宽调制相关文章:脉宽调制原理
离子色谱仪相关文章:离子色谱仪原理


评论


相关推荐

技术专区

关闭