OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4027|回复: 4

[ALTERA] FPGA串口控制PWM(频率、占空比可调)的疑问

[复制链接]

21

主题

243

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-3-12
在线时间
165 小时
发表于 2021-10-31 19:47:20 | 显示全部楼层 |阅读模式

原帖地址:https://blog.csdn.net/weixin_395 ... ssearch_pc_relevant

`timescale 1ns / 1ps
module pwm_gen(

input rst_n,
input sysclk,
input en,

input [15:0] period,
input [15:0] h_time,

output reg pwm

);

reg [31:0] cnt;

always @ (posedge sysclk or negedge rst_n)
begin
    if(!rst_n)
        cnt <= 0;
    else
                begin
                        if(cnt >= period - 1 )
                          cnt <= 0;
                        else
                          cnt <= cnt + 1;
                end
end

always @ (posedge sysclk or negedge rst_n)
begin
    if(!rst_n)
        pwm <= 0;
    else    //rst_n = 1
    begin
        if(en == 0)
            pwm <= 0;
        else    //en = 1
        begin
            if(cnt <= h_time - 1)
                pwm <= 1;
            else
                pwm <= 0;
        end
    end
end

endmodule



我其中串口给定h_time (占空比)和频率period ,但是我不明白为什么要加一个en。其中有一段if(en == 0)
            pwm <= 0;
        else    //en = 1
这是什么意思呢?会不会造成占空比突然变大?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1937
金钱
1937
注册时间
2021-4-16
在线时间
495 小时
发表于 2021-11-1 08:52:37 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

1979

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5520
金钱
5520
注册时间
2018-10-21
在线时间
1561 小时
发表于 2021-11-1 08:56:56 | 显示全部楼层
使能控制,en=0时,pwm固定低电平,不输出
回复 支持 反对

使用道具 举报

21

主题

243

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-3-12
在线时间
165 小时
 楼主| 发表于 2021-11-6 18:43:31 | 显示全部楼层
这个程序是有问题的,PWM波的占空比,突然会跳动一下。具体是en的影响。
回复 支持 反对

使用道具 举报

21

主题

243

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-3-12
在线时间
165 小时
 楼主| 发表于 2021-11-6 18:47:44 | 显示全部楼层
我在网上找到了另外一个程序,做了些修改,原地址是:https://mp.weixin.qq.com/s/1pmkaKHoeINP6caTRBzCBg

`timescale 1ns / 1ps
module pwm_gen(

input rst_n,
input sysclk,
input [15:0] period,//周期 最大65535
input [15:0] duty_cycle_buf,//占空比
output reg pwm1,//PWM输出引脚
);
reg [16:0] cnt_cycle;
//计数器电路,cnt_cycle就是计数器输出计数结果                                                              
always@(posedge sysclk)
begin

    cnt_cycle <= (cnt_cycle == (period-1)) ? 0 : cnt_cycle + 1;       

end   

/*比较器电路   ,pwm_buf  为输出PWM结果,红色字为计数器输入,绿色字为比较器比较线*/

always@(posedge sysclk)

begin

    pwm1 <= (cnt_cycle < duty_cycle_buf) ? 1'b1 : 1'b0;

end   

//只有在cnt_cycle计数一个周期T的时候,占空比值才会更新,也就是比较线才会移动!
//因为输入占空比可以不断改变,也就是第一张图的比较线是会上下移动的,为了不影响我们在计数的过程中突然采集到突变的值最终导致,不平滑的占空比,所以占空比输入在每个计数周期完成后才会去采集。
always@(posedge sysclk)

begin

      if(cnt_cycle == (period-1))
                duty_cycle_buf <= (duty_cycle > period-1) ? period-1 : duty_cycle;

end

endmodule

不明白的是,后面这一句,因为我的占空比和周期是通过串口发送给FPGA,那么我这样写有什么问题??
最后一句,cnt_cycle计数一个周期T的时候,如果为真,占空比值duty_cycle_buf=周期,如果为假占空比duty_cycle_buf=计数值,是这样理解码??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表