精华内容
下载资源
问答
  • 2021-01-14 20:13:43

    在很多工程应用中,需要使用到PWM波(脉宽调制),例如电机调速、温度控制调整功率等。本文讲述怎么利用单片机的一个定时器生成多路PWM波形。
    一般的,PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。PWM适用于高速开关器件的控制,不适合于继电器等低速开关元件的控制,因为继电器等低速元件达不到如此快的开关速度。
    PWM控制的关键是控制改变PWM的高电平时间t2,这个时间在其他子程序中由控制算法中进行修改,如PID控制算法。

    在微处理器,如单片机中,实现一个定时器生成多路PWM的方法如下。
    首先来看看用一个定时器实现一路PWM输出的方法:
    >>定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;
    >>定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;
    >>定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1不改变。
    >>定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。
    程序的流程如下:
    ①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;
    ②初始化变量:n=0;//计时变量n清零
    n1=t1/t;//一个PWM的周期t1包含了多少个基准时间t.
    //假如设PWM周期为100ms,则n1=100;
                      n2=t2/t;//计算一个PWM中高电平时间t2由多少个基准时间//t组成。t2由其他控制算法改变。
    ③ 开始计时,打开定时器中断。定时器中断程序中n++;
    当n<n2&& n<n1时,IO口输出高电平;
    当n>=n2&& n<n1时,IO口输出低电平;

    当n>n1时,返回步骤①进行下一个周期的PWM.

    程序流程图如下:


    如果在同一个定时器中需要多路PWM,再定义多组类似的变量,按照图2 中流程处理即可。

    全文完。

     

    更多相关内容
  • 多路 PWM 原理分析以及实现试验 基本原理(参考 http͗//www͘fpga4fun͘com/PWM_D_C͘html) PWM_(Pulse_Width_Modulation) A PWM takes an input value of any width and creates an output that is just one-bit ...

    多路 PWM 原理分析以及实现试验

    基本原理(参考 http͗//www͘fpga4fun͘com/PWM_D_C͘html)

    PWM_(Pulse_Width_Modulation)

    A PWM takes an input value of any width and creates an output that is just
    one-bit wide.
    PWM using a free-running counter

    That’s the simplest PWM we can make.

    module PWM( 
    input clk, 
    input [3:0] PWM_in, 
    output PWM_out 
    ); 
    
    reg [3:0] cnt; 
    always @(posedge clk) cnt <= cnt + 1'b1;  // free-running 
    counter 
    
    assign PWM_out = (PWM_in > cnt);  // comparator 
    endmodule 
    
    

    We choose a 4bit PWM here so the PWM period is 16. The input
    can go from 0 to 15 so the PWM output ratio goes from 0% to
    15/16=93%. If you need to be able to go up to 100%, the input needs
    to have an extra bit.

    The code works fine, although it is a bit naive in its current form
    because the input must be fixed (or change only when the counter
    overflows = goes back to 0). Otherwise the output will glitch. So most
    likely a bit of extra logic is required (usually in the form of a latch
    capturing the input at the right time).

    PWM using a loadable up-down counter

    That’s a slightly more sophisticated design.

    module PWM( 
    input clk, 
    input [3:0] PWM_in, 
    output PWM_out 
    ); 
    reg [3:0] cnt; 
    reg cnt_dir;  // 0 to count up, 1 to count down 
    wire [3:0] cnt_next = cnt_dir ? cnt-1'b1 : cnt+1'b1; 
    wire cnt_end = cnt_dir ? cnt==4'b0000 : cnt==4'b1111; 
    always @(posedge clk) cnt <= cnt_end ? PWM_in : cnt_next; 
    always @(posedge clk) cnt_dir <= cnt_dir ^ cnt_end; 
    assign PWM_out = cnt_dir; 
    endmodule 
    

    First-order sigma-delta modulator

    A first-order sigma-delta modulator resembles a PWM, but with a
    better frequency response if you need to filter it because of its higher
    frequency output content.

    The simplest way to create a first-order sigma-delta modulator is
    to use an hardware accumulator… every time the accumulator
    overflows, output a ‘1’. Otherwise output a ‘0’. That’s very easily done
    in an FPGA.

    Verilog 
    
    module PWM(clk, PWM_in, PWM_out); 
    input clk; 
    input [7:0] PWM_in; 
    output PWM_out; 
    
    reg [8:0] PWM_accumulator; 
    always @(posedge clk) PWM_accumulator <= 
    PWM_accumulator[7:0] + PWM_in; 
    
    assign PWM_out = PWM_accumulator[8]; 
    endmodule 
    
    

    One-bit DAC

    Take one pin of an FPGA, connect a speaker and listen to an MP3?
    Easy. Here, we’ll use a PC to decode an MP3, and then send the
    decoded data to an FPGA that is configured as a one-bit DAC.

    Audio output

    We require a DAC (digital-to-analog converter) to connect the FPGA
    (digital) to a speaker (analog).
    The conventional approach would be to use a resistor ladder
    (see here), or use a dedicated DAC IC, like the venerable DAC-08.

    Since the frequency at which FPGAs run is so fast compared to the
    frequencies required in the audio domain (MHZ’s compared to KHz’s),
    a one-bit DAC is a better choice.

    Basically, to create the analog output, we smooth out the PWM or
    sigma-delta modulator output pulses using a low-pass filter. A
    sigma-delta modulator is better because of its higher-frequency
    output content, with which a single-order low-pass RC filter is usually
    enough.

    Playing an MP3

    The first step is to decode the MP3. The decoded MP3 data is called
    “PCM” data. To keep things simple, we send the PCM data through the
    serial port of the PC to the FPGA. The maximum rate possible through
    the serial port is 115200 baud (i.e. about 11.5 KBytes per second), so
    the music has to be down-sampled to 11KHz 8 bits. All that is easily
    done by a PC. Here’s the software used (with source code).
    And for the HDL code, we simply modify the sigma-delta modulator so
    that the PWM data input comes from the serial port.

    module PWM(input clk, input RxD, output PWM_out); 
    wire RxD_data_ready; 
    wire [7:0] RxD_data; 
    async_receiver 
    deserializer(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_d 
    ata(RxD_data)); 
    
    reg [7:0] RxD_data_reg; 
    always @(posedge clk) if(RxD_data_ready) RxD_data_reg <= RxD_data; 
    
     
    reg [8:0] PWM_accumulator; 
    always @(posedge clk)   PWM_accumulator   <=   PWM_accumulator[7:0]   + 
    RxD_data_reg; 
    
    assign PWM_out = PWM_accumulator[8]; 
    endmodule 
    
    

    Now is time to connect a speaker to the FPGA. There are 3 basic ways
    to do it.
    在这里插入图片描述

    使用创建和封装 IP 向导创建自定义 IP

    1.使用提供的 axi_lite 从属外设模板和自定义 IP 源代码来创建自定义 IP。

    打开 Vivado 软件,单击 Manage IP,然后选择 New IP Location,然后在新
    建 IP 位置窗口中单击 Next。
    选择 Verilog 作为 Target Language,Mixed 作为 Simulator language,对于
    IP 位置,请键入 D:/IP Core,然后单击 Finish(将其他设置保留为默认值,如果
    提示创建目录,请单击确定)。
    在这里插入图片描述

    2.运行创建和封装 IP向导 选择 Tools > Create and Package New IP…

    在这里插入图片描述
    在下一个窗口中,
    单击 Next
    在这里插入图片描述
    由于我们需要挂在到总线上,因此创建一个带
    AXI 总线的用户 IP,故选择 Create a new AXI4 peripheral。 点击 Next.
    在这里插入图片描述
    设置
    IP 的名字为 ADAU1761,版本号默认,并且记住 IP的位置 ,单击 Next.
    在这里插入图片描述
    设置总线形式为
    Lite 总线, Lite 总线是简化的 AXI 总线消耗的资源少,当然性
    能也是比完全版的 AXI 总线差一点,但是由于音频的速度并不高,因此采用 Lite 总线就够了,设置寄存器数量为 8,因为后面我们需要用到 8个寄存器。 单击
    Next.
    在这里插入图片描述
    选择
    edit IP 单击 Finish 完成
    在这里插入图片描述
    完成后的界面如下图所示
    在这里插入图片描述

    3.用户 IP 的修改

    IP创建完成后,并不能立马使用,还需要做一些修改。

    1. 打开PWM_IP_v1_0.v 文件在以下位置修改
      在这里插入图片描述
      在这里插入图片描述
    2. 打开PWM_IP_v1_0_S00_AXI.v 修改PWM_IP_v1_0_S00_AXI.v 的端口部分
      在这里插入图片描述
    3. slv_reg0、slv_reg1、slv_reg2、slv_reg3、slv_reg4、slv_reg5、slv_reg6、slv_reg7 为PS 部分写入PL 的寄存器。通过这个8 个寄存器的值,我们可以控制PWM 的占空比。
      在这里插入图片描述
    4. 下面这段代码就是PS 写PL 部分的寄存器,一共有8 个寄存器
    
    always @( posedge S_AXI_ACLK )
    begin
    if ( S_AXI_ARESETN == 1'b0 )
    begin
    slv_reg0 <= 0;
    slv_reg1 <= 0;
    slv_reg2 <= 0;
    slv_reg3 <= 0;
    slv_reg4 <= 0;
    slv_reg5 <= 0;
    slv_reg6 <= 0;
    slv_reg7 <= 0;
    end
    else begin
    if (slv_reg_wren)
    begin
    case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    3'h0:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 0
    slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h1:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 1
    slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h2:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 2
    slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h3:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 3
    slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h4:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 4
    slv_reg4[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h5:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 5
    slv_reg5[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h6:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 6
    slv_reg6[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    3'h7:
    for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    // Respective byte enables are asserted as per write strobes
    // Slave register 7
    slv_reg7[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    end
    default : begin
    slv_reg0 <= slv_reg0;
    slv_reg1 <= slv_reg1;
    slv_reg2 <= slv_reg2;
    slv_reg3 <= slv_reg3;
    slv_reg4 <= slv_reg4;
    slv_reg5 <= slv_reg5;
    slv_reg6 <= slv_reg6;
    slv_reg7 <= slv_reg7;
    end
    endcase
    end
    end
    end
    

    5新建一个PWM_driver.v 文件实现8 路PWM 并行输出然后保存到PWM_IP_1.0/hdl 文件夹,并添加进来。
    在这里插入图片描述
    在这里插入图片描述

    PWM_driver.v具体内容为:
    module PWM_driver(
    input clk_i,
    input rst_n_i,
    input [31:0]pwm_reg0_i,
    input [31:0]pwm_reg1_i,
    input [31:0]pwm_reg2_i,
    input [31:0]pwm_reg3_i,
    input [31:0]pwm_reg4_i,
    input [31:0]pwm_reg5_i,
    input [31:0]pwm_reg6_i,
    input [31:0]pwm_reg7_i,
    output reg [7:0] pwm_o
    );
    reg[31:0]pwm_cnt0;
    reg [31:0]pwm_cnt1;
    reg [31:0]pwm_cnt2;
    reg [31:0]pwm_cnt3;
    reg [31:0]pwm_cnt4;
    reg [31:0]pwm_cnt5;
    reg [31:0]pwm_cnt6;
    reg [31:0]pwm_cnt7;
    //pwm0
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt0 <= 32'd0;
    pwm_o[0] <= 1'b0;
    end
    else begin
    if(pwm_cnt0<pwm_reg0_i)begin
    pwm_cnt0 <= pwm_cnt0 +1'b1;
    end
    else begin
    pwm_cnt0<=32'D0;
    pwm_o[0]<=~pwm_o[0];
    end
    end
    end
    //pwm1
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt1 <= 32'd0;
    pwm_o[1] <= 1'b0;
    end
    else begin
    if(pwm_cnt1<pwm_reg1_i)begin
    pwm_cnt1 <= pwm_cnt1 +1'b1;
    end
    else begin
    pwm_cnt1<=32'D0;
    pwm_o[1]<=~pwm_o[1];
    end
    end
    end
    //pwm2
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt2 <= 32'd0;
    pwm_o[2] <= 1'b0;
    end
    else begin
    if(pwm_cnt2<pwm_reg2_i)begin
    pwm_cnt2 <= pwm_cnt2 +1'b1;
    end
    else begin
    pwm_cnt2<=32'D0;
    pwm_o[2]<=~pwm_o[2];
    end
    end
    end
    //pwm3
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt3 <= 32'd0;
    pwm_o[3] <= 1'b0;
    end
    else begin
    if(pwm_cnt3<pwm_reg3_i)begin
    pwm_cnt3 <= pwm_cnt3 +1'b1;
    end
    else begin
    pwm_cnt3<=32'D0;
    pwm_o[3]<=~pwm_o[3];
    end
    end
    end
    //pwm4
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt4 <= 32'd0;
    pwm_o[4] <= 1'b0;
    end
    else begin
    if(pwm_cnt4<pwm_reg4_i)begin
    pwm_cnt4 <= pwm_cnt4 +1'b1;
    end
    else begin
    pwm_cnt4<=32'D0;
    pwm_o[4]<=~pwm_o[4];
    end
    end
    end
    //pwm5
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt5 <= 32'd0;
    pwm_o[5] <= 1'b0;
    end
    else begin
    if(pwm_cnt5<pwm_reg5_i)begin
    pwm_cnt5 <= pwm_cnt5 +1'b1;
    end
    else begin
    pwm_cnt5<=32'D0;
    pwm_o[5]<=~pwm_o[5];
    end
    end
    end
    //pwm5
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt6 <= 32'd0;
    pwm_o[6] <= 1'b0;
    end
    else begin
    if(pwm_cnt6<pwm_reg6_i)begin
    pwm_cnt6 <= pwm_cnt6 +1'b1;
    end
    else begin
    pwm_cnt6<=32'D0;
    pwm_o[6]<=~pwm_o[6];
    end
    end
    end
    //pwm7
    always @(posedge clk_i)begin
    if(!rst_n_i)begin
    pwm_cnt7 <= 32'd0;
    pwm_o[7] <= 1'b0;
    end
    else begin
    if(pwm_cnt7<pwm_reg7_i)begin
    pwm_cnt7 <= pwm_cnt7 +1'b1;
    end
    else begin
    pwm_cnt7<=32'D0;
    pwm_o[7]<=~pwm_o[7];
    end
    end
    end
    endmodule
    
    

    6.点击File–>点击 Save all files,最终如下
    在这里插入图片描述
    4.修改完成后还要重新打包
    1 选择 tool–>Create and Package New Ip…
    2. 选择 package your current project 选择 next
    在这里插入图片描述
    3.保持默认设置,不做任何修改,点击 Next
    在这里插入图片描述
    4.点击 Next 选择 Overwrite
    在这里插入图片描述
    5.点击 Finish,完成。
    在这里插入图片描述
    6.执行以下操作检查 IP是否封装完成,展开 IP XACT(1)>双击
    component.xml,展开 Ports and Interface,可以看到封装 IP完成。
    在这里插入图片描述
    至此,创建用户
    IP完成。
    5添加 PWM_IP_v1_0 IP
    重新建立一个新的空的工程。
    Create Block Design 直接添加 zynq7 processing system。这个前面的教程内容部分已经重复很多次了,这里不重复。
    1.在进程导航窗格中,单击 Project Setting选项,选择 IP,然后单击 Add Repository 按钮。 浏览窗口打开,浏览到 IP核的位置

    D:/IP Core/ip_repo/PWM_IP_1.0 然后单击“ Select”,单击 Ok。
    在这里插入图片描述
    2.注意工具如何在目录中检测到新的 IP,点击 Apply,然后 OK。
    在这里插入图片描述
    3.这样做后,就可以将 PWM_IP_v1.0添加到当前项目的 IP库中,下一步是
    将其添加到块设计中,并将其从一侧连接到 Zynq处理系统,并从另一侧通过使
    用外部端口连接到 LED板块 。
    4.由于前面的过程非常详细,很多步骤省略,搭建完成后的系统如下图所示
    在这里插入图片描述
    5.添加 管脚约束 文件,之后编译工程,导出到 SDK,这个步骤前面的教程中
    也是重复过,不再过多重复,这里只给出 管脚约束 文件 PWM_pin.xdc

    set_property PACKAGE_PIN T22 [get_ports {pwm_o[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[0]}]
    set_property PACKAGE_PIN T21 [get_ports {pwm_o[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[1]}]
    set_property PACKAGE_PIN U22 [get_ports {pwm_o[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[2]}]
    set_property PACKAGE_PIN U21 [get_ports {pwm_o[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[3]}]
    set_property PACKAGE_PIN V22 [get_ports {pwm_o[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[4]}]
    set_property PACKAGE_PIN W22 [get_ports {pwm_o[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[5]}]
    set_property PACKAGE_PIN U19 [get_ports {pwm_o[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[6]}]
    set_property PACKAGE_PIN U14 [get_ports {pwm_o[7]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {pwm_o[7]}]
    

    6.SDK 工程源码
    SDK 工程部分的 C 工程新建工程也不详细讲解,前面已经重复很多次了,
    这里只给出 C 代码略作分析。

    #include "xparameters.h"
    #include "stdio.h"
    #include "xil_io.h"
    #define PWM_REG0 XPAR_PWM_IP_V1_0_0_BASEADDR + 0
    #define PWM_REG1 XPAR_PWM_IP_V1_0_0_BASEADDR + 4
    #define PWM_REG2 XPAR_PWM_IP_V1_0_0_BASEADDR + 8
    #define PWM_REG3 XPAR_PWM_IP_V1_0_0_BASEADDR + 12
    #define PWM_REG4 XPAR_PWM_IP_V1_0_0_BASEADDR + 16
    #define PWM_REG5 XPAR_PWM_IP_V1_0_0_BASEADDR + 20
    #define PWM_REG6 XPAR_PWM_IP_V1_0_0_BASEADDR + 24
    #define PWM_REG7 XPAR_PWM_IP_V1_0_0_BASEADDR + 28
    int main()
    {
    Xil_Out32(PWM_REG0,100000000);
    Xil_Out32(PWM_REG1,100000000/2);
    Xil_Out32(PWM_REG2,100000000/4);
    Xil_Out32(PWM_REG3,100000000/8);
    Xil_Out32(PWM_REG4,100000000/10);
    Xil_Out32(PWM_REG5,100000000/16);
    Xil_Out32(PWM_REG6,100000000/20);
    Xil_Out32(PWM_REG7,100000000/32);
    return 0;
    }
    

    以上函数中
    我们自定一点 PWM IP 寄存器中写 数据,实现了 100MHZ AXI4 总线的 2 分
    频、 4分频、 8 分频、 10 分频、 16 分频、 20 分频、 32 分频。
    测试完成,现象:
    8个 灯 流水 亮起。

    展开全文
  • PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。

    PWM产生原理

    PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1。改变一个周期中高电平的时间,就能达到速度或者功率调整的目的。

    定时器生成一路PWM

    基于STM32用一个定时器实现一路PWM输出的方法:

    1. 定义一个时间基准刻度t,这个也是计时器中断周期,一般在程序中t不改变。PWM的周期、高低电平时间由若干个基准时间t组成;

    我们用的单片机是STM32F103VBT6,我们选用TIM2作为基本定时器,CobeMX中的配置如图所示:

    TIM2的时钟频率是64MHZ,计数模式选择向上计数,计满之后产生定时中断,中断一次的时间是1毫秒,故基准刻度t是1毫秒。

    并开启定时中断

    2. 定义一个全局计时变量n,n表示这段时间经过了多少个基准时间t;后期我们在中断中定义一个全局变量CountTimer_2,每终端一次加1,即可得知定时时间。

    3. 定义一个全局计时变量n1,n1表示一个PWM的周期包含多少个基准时间t,n1=t1/t。一般在程序中n1,t1是计时周期不改变。

    4. 定义一个全局计时变量n2,n2表示一个PWM周期中高电平包含多少个基准时间t,n2=t2/t。由于高电平的时间受其他算法控制改变的,n2也是随时在改变。

    程序的流程如下:

    ①初始化定时器,定时器中断时间设置为t,如设置t为1ms或其他;

    ②初始化变量:n=0;//计时变量n清零 

    uint32_t CountTimer_2 = 0; 

    n1=t1/t;     //一个PWM的周期t1包含了多少个基准时间t,假如设PWM周期为1000ms=1s,则n1=1000;

      if(CountTimer_2==1000)

    n2=t2/t;     //计算一个PWM中高电平时间t2由多少个基准时间t组成。t2由其他控制算法改变。

    ③开始计时,打开定时器中断。定时器中断程序中n++;

    展开全文
  • 该控制系统依据由可编程逻辑器件FPGA实现多路PWM控制系统的原理和方法,选择新型FPGA芯片MAX10作为主控芯片,该芯片集成了AD采样控制、控制算法和PWM 波形生成等电路,大大降低了电路的复杂程度。仿真和实验结果验证...
  • 为了满足一种新能源发电领域的电力电子变换装置上逆变器触发的要求,研制了利用OMAPL138和FPGA实现的多路PWM脉冲发生器。该脉冲发生器利用接口单元接收OMAPL138写入的PWM脉冲占空比和设置参数等数据,利用FPGA产生PWM...

    为了满足一种新能源发电领域的电力电子变换装置上逆变器触发的要求,研制了利用OMAPL138和FPGA实现的多路PWM脉冲发生器。该脉冲发生器利用接口单元接收OMAPL138写入的PWM脉冲占空比和设置参数等数据,利用FPGA产生PWM波形,达到其工作不受OMAPL138影响的效果。同时介绍了脉冲发生器的硬件架构、基本原理和实现方法,并通过仿真和实验得到验证。该PWM发生器既简化了电路的设计,提高了系统的可靠性,又可保证逆变器功率元件触发的同步。 

    1 评估板简介
    基于TI OMAP-L138(定点/浮点 DSP C674x+ARM9)+ Xilinx Spartan-6 FPGA处理器;
    OMAP-L138 FPGA 通过uPP、EMIFA、I2C总线连接,通信速度可高达 228MByte/s;OMAP-L138主频456MHz,高达3648MIPS和2746MFLOPS的运算能力;
    FPGA 兼容 Xilinx Spartan-6 XC6SLX9/16/25/45,平台升级能力强;
    开发板引出丰富的外设,包含千兆网口、SATA、EMIFA、uPP、USB 2.0 等高速数据传输接口,同时也引出 GPIO、I2C、RS232、PWM、McBSP 等常见接口;
    通过高低温测试认证,适合各种恶劣的工作环境;
    DSP+ARM+FPGA三核核心板,尺寸为 66mm*38.6mm,采用工业级B2B连接器,保证信号完整性; Ø
    支持裸机、SYS/BIOS 操作系统、Linux 操作系统。


    图1 开发板正面和侧视图 

    XM138F-IDK-V3.0 是一款基于深圳信迈XM138-SP6-SOM核心板设计的开发板,采用沉金无铅工艺的4层板设计,它为用户提供了 XM138-SP6-SOM核心板的测试平台,用于快速评估XM138-SP6-SOM核心板的整体性能。

    XM138-SP6-SOM引出CPU全部资源信号引脚,二次开发极其容易,客户只需要专注上层应用,大大降低了开发难度和时间成本,让产品快速上市,及时抢占市场先机。不仅提供丰富的 Demo 程序,还提供详细的开发教程,全面的技术支持,协助客户进行底板设计、调试以及软件开发。

    2 典型运用领域
    数据采集处理显示系统
    智能电力系统
    图像处理设备
    高精度仪器仪表
    中高端数控系统
    通信设备
    音视频数据处理


    图2 典型应用领域

     

    3 软硬件参数
    开发板外设资源框图示意图

     

    图3 开发板接口示意图

     

    图4 开发板接口示意图

     

    展开全文
  • 不用定时器,使用特殊的软件延时方法可以达到多路PWM控制舵机,即使不能并行输出的C51也可以做到
  • 学 号 分类号TN787.2本科生毕业论文(设计)题目: 基于单片机的多路PWM 输出系统的设计院 (系) 电子与信息工程系专 业 电子信息工程班 级 2009级1班学 生 姓 名指导教师(职称)提 交 时 间 二〇一三年五月版权声明任何...
  • 硬件设计——PWM原理与设计

    千次阅读 2021-07-20 10:21:13
    PWM的全称是脉宽调制技术,英文名称是Pulse Width Modulation,其工作的实质就是模拟信号进行数字编码,这是一种方法。 频率 是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个...
  • STM32 多路PWM信号频率检测

    千次阅读 2019-09-05 21:59:09
    用STM32的TIM3 TIM4进行8方波信号的频率检测 ...
  • 单片机应用于舞台灯光、民用照明的调光、电机转速、温度控制等众多领域时需要用到PWM占空比进行调节。市场上,集成了硬件PWM模块的单片机型号如PIC16F628A、STC12C2052等。使用硬件PWM时仅需进行一些特殊功能寄存器...
  • stm32c8t6多路舵机PWM输出 对于舵机的简单使用大家都不陌生,在实验中使用的SG90舵机最大转动角度为180度,而对舵机控制的原理是我们每一个使用者都应该了解的,具体的可以从下面这张角度和占空比的关系看看出来。 ...
  • 提出了一种基于PWM的新型移动通信光纤多路中继传输系统。该系统可以排除现有模拟光纤中继传输系统中的非线性和噪声干扰,而要求的传输码率又比一般数字系统低近10倍,成本比相同传距的模拟光纤中继器低十多倍。
  • 这个模式是STM32输入捕获检测脉宽和频率的一种硬件处理机制,大大减小了代码量,提高了检测效率,而实际上对于PWM信号的检测还有其他方法,并且关于繁琐的寄存器的介绍这里就不说了,有兴趣的话可以直接去我的另外...
  • 单片机_PWM输出原理详解

    万次阅读 多人点赞 2019-02-24 20:30:51
    单片机_PWM输出原理详解 理论篇   博主自己的经历告诉我,PWM波的理解和应用确实还是挺重要的,这里专门花一期详细介绍一下 什么是PWM?   PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是...
  • 该设计使用STM32F407为主要控制芯片,使用不同的PWM输出口,分别各自单独控制电机,使得电机互相直接独立工作互不干涉,可以个电机同时运动,提高设备运动性能,通过加减速算法,电机运行S型曲线。本设计同时设计...
  • 32.PWM输出原理与配置

    2022-03-16 10:36:16
    PWM输出原理与配置
  • 用STM32CubeMX配置输出PWM信号控制多路舵机以STM32F103C8t6为例
  • 上次做了一个通道输出的PWM波,由于有时候我们需要输出PWM波形,但是只有少量可用定时器的情况下我们需要使用一个定时器提供PWM波,本次实验目的就是生成三个频率都为500Hz,占空比为60%、70%、80%的PWM波。
  • 目前,多路照明LED 正在被广泛的应用,但每个LED 都是配有一个单独的驱动源,...通过实验研究,阐述了多路调光控制的原理,论证了两种调光方法的可行性,得出了整个电路输入输出关系,从而可以具体控制多路LED 的亮度。
  • 通过实验研究,阐述了多路调光控制的原理,论证了两种调光方法的可行性,得出了整个电路输入输出关系,从而可以具体控制多路LED 的亮度。  1 引言  照明技术在过去的一百多年里, 经历了三个重要的发展阶段:...
  • 摘要:介绍了开关电源电流型PWM控制技术的原理和优点,并基于UC3842芯片设计了+5V/4A,±12V/1A三输出的反激式电源,具体分析了电路的工作原理和高频变压器参数的计算。关键词:脉宽调制;电流控制模式;反激式 ...
  • 单片机PWM输出原理与实践

    千次阅读 2020-11-26 16:05:51
      通俗的说,就是控制在一个周期内,控制高电平长时间,低电平长时间(前面文章种有说过IO口就只有两种状态,0和1,对应就是0和5V或者0和3.3V)。也就是说通过调节高低电平时间的变化来调节信号、能量

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,090
精华内容 1,236
关键字:

多路pwm原理

友情链接: iPhoneUI_v1[1][1].1_src.zip