一个关于fpga输出pwm的问题

一个关于fpga输出pwm的问题,第1张

用pwm_count 和count[13:4]进行比较;就是要count变呀,不然你的PWM怎么输出呢;因为count在变所以才会出现周期脊缺性的大于pwm_count然后小于pwm_count,这样PWM不就出来了了么,PWM的周期就是count[13:0]和count[13:4]比较,省去了低第四位,是怕脉冲为零或者是脉冲过窄,这样IO根本输不出来信号;没有赋初值的很有可能出问题,但基本上都是0;你要加入一个复位信号来初始化那些寄存器,这样做更规范些;以后写程序必须加复位信号;现在你就知道为什么单片机要复位了吧,就是怕里面的寄存器和变量不听话,复位的时候全部从新赋值;单片机说白了就是一个专用IC,FPGA它也可以变成专耐蠢用IC,所以在FPGA的场合升级很方便,不用把芯片樱亩辩换了,直接升级固件,它就有了新的功能,这一点比专用IC灵活。希望能帮到你。

很简单啊,你按不同的相位采集存到寄老埋御存器就可以了。比如你的pwm的精度是1024/周期,那么24个相位的间隔就是1024/24 = 42.666。那么你可以首先把整个周期都存下来,每隔43个左右输出一路。

reg [1023:0] wave_reg

always@(posedge clk)

wave_reg <={ wave_reg[1022:0],pwm_wave}//把整个波形都存下来,但是可能比较侍岩耗寄存器。

assignwave_out[0] = wave_reg[0]

assignwave_out[1] = wave_reg[43]//有时候加43,有时候加42,保证到后面刚好。

……

assign wave_out[23] = wave_reg[981]

但是这种做法大概会消耗1024个寄存器,液氏随着pwm精度的提高,这个消耗会提高。

如果你只存半个周期,而由于正弦波是基对称的,

assign wave_out[12] = ~wave_out[0]

……

assign wave_out[23] = ~wave_out[11]

这样会少一半的寄存器。

硬件则逗纳的话需要一指乱个全桥生成正负电压。我不了解L298是什么,我一般自己做一个。不过大概都一样,就是你FPGA输出的io信号是PWM的开关高低电平信号,直接给电机驱动即可。按键就是IO输入。剩下的就是编程的工作了。

不过这个我还是建议你用单片机。真的,我就是做电机控制软硬件的。FPGA做流程控制不太方便。当然,FPGA里面也有processer,或称软核。quartus自带一款叫 NIOS 的软核,可以C语言编程。如果你控制大电机的话我们再单说,如果是小电机不在乎动态过程,只要稳态速度的话,还是比较简单的。编程思路就是 电机电压= k*电机转速。这个K系数孙没跟你的电机有关系,不过是一个常数。也就是说, 当你要正转速的时候,给正电压即可。要负转速的话,给负电压。电压得到之后,其实就是占空比,然后你用FPGA生成PWM信号输到驱动器里面即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12258794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存