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

发布者:炫酷骑士最新更新时间:2013-02-06 来源: dzsc关键字:单片机驱动  PWM  正弦信号发生器 手机看文章 扫描二维码
随时随地手机看文章
  前面几期给读者介绍了单片机+CPLD 系统设计,本篇继续挖掘CPLD 潜力,给出一种单片机驱动CPLD的PWM 正弦信号发生器设计,充分体现了CPLD 的灵活多变,配合单片机控制,其妙无穷,以下方案均在Mini51 板上实现。

  脉宽调制PWM(Pulse Width Modulation)是利用数字输出信号对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

  一、PWM原理

  PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON) 或断(OFF) 的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。

  只要带宽足够,任何模拟值都可以使用PWM 进行编码。

  如图1 所示,用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N 等分,看成N 个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。

图1 用PWM波代替正弦半波

图1 用PWM波代替正弦半波

  SPWM 波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM 波形。

  二、基于CPLD的PWM方案

  一个PWM 发生器必须包括计数器,数据比较器,另外就是配置PWM 参数的时钟分频寄存器和占空比寄存器,结构框图如图2 所示,这些电路都可以用CPLD 来实现。

图2 PWM控制器结构框图

图2 PWM控制器结构框图

  高频时钟信号经分频器驱动计数器,计数器如图3 所示,总是从Bottom 到Top 的循环计数,计数器的输出和占空比寄存器里的数据经数据比较器比较,输出PWM 信号,当计数器输出小于占空比设定值时输出低电平(0),否则输出高电平(1),如图3(b)(c)所示。

图3 PWM信号发生器时序波形图

图3 PWM信号发生器时序波形图

  从图中还可以看出,计数器的周期就是PWM 信号的周期,通过修改占空比寄存器从而实现对输出PWM 信号高低电平比例控制,图3(b)是占空比为P1 的PWM输出,图3(c)是占空比为P2 的PWM 输出,它们周期相同,高低电平的比例不同。[page]

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

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

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

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

  output PWM;//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(daPWMc<100) 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

  #include

  #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) ;

  }

[page]

    执行单片机程序,选择不同的分频系数和占空比值,从CPLD 的引脚输出PWM 信号示波器截图如图4所示。

图4 不同占空比的PWM信号示波器截图

图4 不同占空比的PWM信号示波器截图

图4 不同占空比的PWM信号示波器截图

  三、SPWM

  如果将占空比按正弦规律随着时间变化,就可以得到正弦调制的PWM 信号,也就是SPWM。如图5 所示,该信号经过阻容滤波可以得到正弦模拟信号,这里的运放做电压跟随器用,对信号驱动能力进行放大。实际得到的正弦信号示波器截图效果如图6 所示。

图5 SPWM阻容滤波电路

图5 SPWM阻容滤波电路

图6 正弦信号示波器截图

图6 正弦信号示波器截图

图6 正弦信号示波器截图

[page]

    正弦信号发生器MCU 演示程序:

  #include

  #include

  #define PWM XBYTE[0xffe8]

  unsigned char code sine_dot[32]={49,59,68,77,84,90,95,98,99,98,95,90,84,77,68,59,49,40,30,22,14,8,4,1,0,1,4,8,14,22,30,40};// 正弦表

  void main()

  {

  unsigned char i=0;

  while(1) {

  PWM = sine_dot[i];

  i=(i++)&0x1f;

  }// 如果要严格控制SPWM 的周期,这里的while 循环请用定时器来驱动

  }

  四、三路精确相位差正弦信号发生器

  对CPLD 改进设计,很容易实现多路PWM 输出。

  例如设计具有精确相位差的三相正弦信号,CPLD 电路VerilogHDL 程序如下:

  module Mini51b_PWM(P0,ALE,P27,WR,PWM);

  input [7:0]P0;

  input ALE,P27,WR;

  output [2:0]PWM;

  wire [3:0]addr;

  reg [7:0]daPWMc;

  reg [7:0]daPWMs0,daPWMs1,daPWMs2;

  reg [2:0]PWM;

  wire clk,nclk,a,b,c,d;

  assign addr= (ALE)?P0[3:0]:addr; // 低八位地址锁存

  always @(negedge WR)

  begin

  case({P27,addr})

  5\'H10: daPWMs0 <= P0;// 写带地址的寄存器

  5\'H11: daPWMs1 <= P0;// 写带地址的寄存器

  5\'H12: daPWMs2 <= P0;// 写带地址的寄存器

  default:

  begin

  daPWMs0 <= daPWMs0;

  daPWMs1 <= daPWMs1;

  daPWMs2 <= daPWMs2;

  end

  endcase

  end

  always @(posedge clk) begin

  daPWMc <= daPWMc+1; //PWM 调整精度1%

  if(daPWMs0 < daPWMc) PWM[0] <= 0;//PWM 发生器

  else PWM[0] <= 1;

  if(daPWMs1 < daPWMc) PWM[1] <= 0;//PWM 发生器

  else PWM[1] <= 1;

  if(daPWMs2 < daPWMc) PWM[2] <= 0;//PWM 发生器

  else PWM[2] <= 1;

  end

  assign nclk=!clk;

  LCELL A0(。in(nclk), .out(a));

  LCELL A1(。in(a), .out(b));

  LCELL A2(。in(b), .out(c));

  LCELL A3(。in(c), .out(d));

  LCELL A4(。in(d), .out(clk));//PWM 时钟来自CPLD 内部

  LCELL 延迟电路振荡器

  endmodule

  与之对应的MCU 演示程序:

  #include

  #include

  #define PWM0 XBYTE[0xfff0]

  #define PWM1 XBYTE[0xfff1]

  #define PWM2 XBYTE[0xfff2]

  unsigned char code sine_dot[36]= //8 阶,36 点正弦表

  {

  0x80,0x96,0xab,0xbf,0xd2,0xe2,0xee,0xf8,0xfe,0xff,0xfe,0xf8,

  0xee,0xe2,0xd2,0xc0,0xab,0x96,0x80,0x69,0x54,0x40,0x2

  d,0x1e,

  0x11,0x07,0x01,0x00,0x01,0x07,0x10,0x1d,0x2d,0x3f,0x53,

  0x69

  };

  void main()

  {

  unsigned char a,b,c;

  a=0;

  while(1) {

  a %= 36;// 对36 取余数及0~35

  b=(a+12)%36;// 较a 路滞后120 度相位

  c=(a+24)%36;// 较a 路滞后240 度相位

  PWM0 = sine_dot[a];

  PWM1 = sine_dot[b];

  PWM2 = sine_dot[c];

  a++;

  }

  }

  实际得到的三相正弦信号示波器截图效果如图7所示,只是双踪示波器同时只能看两路信号。

图7 具有精确相位差的三相正弦信号示波器截图

图7 具有精确相位差的三相正弦信号示波器截图

  五、结束语

  今后,MCU+CPLD 结构将是很多电子系统设计的一种基本架构,MCU 可以用程序实现复杂智能的控制与检测,CPLD 又可以实现灵活多变的外围扩展电路设计,尤其是可以用硬件实现特殊的MCU 无法实现的功能,弥补MCU 响应速度慢影响实时性问题,两者互补,完全实现硬件软设计,使得同一硬件平台能够通过软件实现更多的功能。

关键字:单片机驱动  PWM  正弦信号发生器 引用地址:单片机驱动CPLD的PWM正弦信号发生器设计

上一篇:基于Web单片机与CC430F6127的通信电源监控系统
下一篇:TB1251N单片机芯彩电电源电路解析

推荐阅读最新更新时间:2024-03-16 13:18

增强定时计数器和PWM输出功能
1.1 引言 随着计算机技术和电力电子技术的发展,变频驱动技术凭借其优异的性能,在当今交流调速领域的应用越来越广。 变频驱动主要使用的驱动波形主要有SPWM和SVPWM两种。SPWM原理简单、实现容易,是现在使用最广的一种变频驱动波形。但其有一个致命的弱点是其电源利用率不高(只有86%)、谐波成分大。因此,在新近开发的产品中其应用逐渐被性能优异的SVPWM所取代。 SVPWM是一种电压利用率、低谐波成分的变频驱动波形,还有开关次数少、功率管功耗小等特点。同时,SVPWM还能很好的结合矢量控制算法、以最大限度的发挥设备的性能。因此被越来越多的变频设备所采用。 1.2 芯片简介 SPMC75系列MCU是凌阳
[单片机]
增强定时计数器和<font color='red'>PWM</font>输出功能
基于ATMEGA16L单片机PWM功能的数控恒流源研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高。现今,电源设备有朝着数字化方向发展的趋势。然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的,这虽然能获得较高的精度,但也使得成本大为增加。本文介绍一种基于AVR单片机PWM功能的低成本高精度数控恒流源,能够精确实现0~2A恒流。 系统框图 图1为系统的总体框图。本系统通过小键盘和LCD实现人机交流,小键盘负责接收要实现的电流值,LCD 12864负责显示。AVR单片机根据输入的电流值产生对应的PWM波,经过滤波和功放电路后对压控恒流元件进行控制,产生电流,电流再经过采样电阻到达负载。同时,对采样电阻两端信号进行差分
[单片机]
基于ATMEGA16L<font color='red'>单片机</font><font color='red'>PWM</font>功能的数控恒流源研制
HPM6000系列PWM波尽在掌握
概 述 在进行电机类、电源类应用开发时,如何使用PWM定时器模块灵活、高效的实现所需 PWM波形的输出,是众多开发者关注的问题。在上篇文章里,我们介绍了PWM定时器模块内的一些概念,以及如何生成普通PWM的过程。本篇内容将继续介绍互补PWM、同步 PWM、错相 PWM以及PWM如何使用ACMP封波等内容。 互补PWM 关于相同的代码部分,此处不再重复讲解,请参考《上篇》的普通PWM的讲解。 此处设置了 3 个比较器:cmp_config 与 cmp_config 用来生成中心对称 PWM,cmp_config 作为 PWM 影子寄存器的更新事件源,当 CNT 等于 cmp_config 时,影子寄存器写入寄存器内生效。
[嵌入式]
HPM6000系列<font color='red'>PWM</font>波尽在掌握
PIC单片机输出比较(PWM)模块介绍
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。 将输出比较模块配置为PWM 操作,需要以下步骤: 1.将OCx输出配置为可用的外设引脚选择引脚之一。 2.计算所需的占空比并将计算结果装入 OCxR 寄存器。 3.计算所需的周期并将计算结果装入 OCxRS 寄存器。 4.选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL 4:0 (OCxCON2 4:0 ),把 0 写入OCTRIG (OCxCON2 7 )。 5.通过写 OCTSEL2 2:
[单片机]
基于电机PWM输出方式的电流再生方法
在之前文章对有刷直流电机的PWM驱动原理的说明中,介绍了基于电机两端短路的电流再生方法,实际上有刷直流电机的PWM驱动中还有其他电流再生方法,有刷直流电机的PWM驱动中的每种方法都有其应该考虑的事项。 使用PWM输出方式驱动有刷直流电机:电流再生方法 下面是用来说明PWM驱动原理的示意图。其中省略了没必要列出的晶体管。(a)是施加电压时的电流再生,(b)是电机两端短路方法的电流再生。 由于使用了晶体管(在该示例中为MOSFET)来切换H桥,因此作为现实问题,需要将晶体管的导通电阻作为每条路径中的损耗加以考虑。该思路也同样适用于后续的电流再生方法。 除了(b)以外,还有三种电流再生方法。(c)是在施加电压的状态下的只
[嵌入式]
基于电机<font color='red'>PWM</font>输出方式的电流再生方法
STM8S通过官方LIB使用定时器1从CH4输出PWM
在看STM8S的中文datasheet看得稀里糊涂的,这块功能调了两个晚上才出来。 贴出如下代码,给大伙参考: TIM1_DeInit(); TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 999, 0x00);//250 TIM1_OC4Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, 499, TIM1_OCPOLARITY_LOW, TIM1_OCIDLESTATE_RESET);//50%占空比 TIM1_CCxCmd(TIM1_CHANNEL_4, ENABLE); TIM1_OC4PreloadConfig(ENABLE); T
[单片机]
单片机驱动继电器方式
电路一: 有不少的设计采用这样的电路来驱动继电器,虽然同样能工作,但实际上这样做是不合理的,经过细致分析后会发现Q3根本就不能完全饱合的。 估且我们不算R1的阻值为多大,假设我们现在使Q1基极电流最大,取R1=0;当控制信号电压为0时, Q1 eb极的电压为0.7V,同样ec极电压也为0.7V,而9012的管子在完全饱合的情况下ec极电压应为0.2V。很显然该管工作在非完全饱合状态;继电器上最大限度也只能获得11.3V的电压。 要想管子完全饱合,基极电流要足够大,那么基极需要电压为-0.7V以下。 电路二: 再来看看该电路 当控制端电压为0时,Q1基极电压为(12-0.7=11.3V),改变R1的大小便可改变
[单片机]
stm8s103单片机输出PWM波程序
void Timer2_Init(void) { CLK_ICKR|=0x01; while(!(CLK_ICKR&0x02)); CLK_SWR=0xe1; TIM2_PSCR=0x04; TIM2_ARRH=0x01; TIM2_ARRL=0x00; TIM2_CCER1_CC1P=1; TIM2_CCER1_CC1E=1; TIM2_CCMR1_OC1M=0x60; TIM2_CCMR1_CC1S=0; TIM2_CCR1H=0x00; TIM2_CCR1L=0x20; TIM2_IER=0x00; TIM
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved