基于FPGA的直流电机PWM控制系统
一,项目要求
通过FPGA的数字PWM对电机进行控制。要求可以显示直流电机马达的转速,可以利用按键来控制电机的转速和转动的方向。
本工程使用的开发平台为DE1-SOC开发板。利用quartus18.2开发软件。
直流电机马达使用电机驱动模块来进行驱动。
二,工程实现原理
该工程由 测速模块,输入控制模块,数码管显示模块,pwm波形发生器模块组成。
各个模块的功能如下:
(1) 测速模块:用于测量电机的相对速度
(2) 输入控制模块:用于按键输入的消抖以及pwm占空比的设置,电机的转向控制。
(3) 数码管显示模块:用于显示电机的相对速度
(4) pwm波形发生器模块:用于产生pwm波。
原理框图
输入输出引脚定义
三,工程代码实现
1,测速模块
光电测速传感器有三个引脚VCC,GND,OUT。OUT为传感器的输出端,在传感器有障碍物遮挡时,输出高电平,在没有障碍物遮挡时,输出低电平。电机马达每转一圈,遮挡一次传感器。
光电测速传感器
在FPGA端,检测传感器每两个高电平的时间间隔,即可换算出电机马达的速度。
具体实现原理为,利用上升沿检测原理,检测出传感器每次输出电平由低变为高的时间,并利用计数器记录两个上升沿之间的时间间隔。具体代码如下:
(1)上升沿检测。信号speed_rise为上升沿标志信号。当speed_rise为高时,说明存在speed信号的上升沿。信号speed为测速模块的输出信号。用两级寄存器接收传感器信号,不仅达到了消抖的专用,同时也达到了上升沿检测的目的。
(2)利用计数器记录每两个上升沿之间的时间。
speed_count为速度计数值,speed_count本质记录的是两个上升沿之间的时钟计数值。此次工程使用的时钟为50MHz,一次计数的时间间隔为20ns。
(3)1秒更新一次计数值,用于数码管的显示。
time_cnt用于1秒的计数,当时间大于1秒且遇到传感器输出信号的上升沿时,接收上一次速度的计数值。speed_Average用于缓存每一秒接收到的速度计数值。利用speed_count的40-14位做位测量的相对速度。则speed_Average的一次计数间隔为 20ns * 214 = 0.3 ms,用speed_Average来显示电机转动的相对速度,转动一圈的时间约为 speed_Average (即数码管的显示值)*0.3ms。
(4)提取速度计数值的每一位的值,用于传输到数码管显示模块中去显示。
seg0,seg1,seg2,seg3,seg4,seg5。分别对应6个数码管所显示的内容。将speed_Average对应的10进制的每一位提取到seg0,seg1,seg2,seg3,seg4,seg5中,送到数码管显示模块中进行显示。
2,数码管显示模块
DE1-SOC的数码管的引脚没有共用,这为程序设计提供了便利,没有必要使用动态刷新尽可以独立控制各个数码管的显示状态。
数码管的原理图
数码管显示模块用于将接收到的数字解码为数码管每个段位的亮灭情况,达到是数码管显示数字的目的。
3,输入控制模块
输入控制模块负责控制pwm波的占空比,电机转向等
(1)按键消抖模块
用一个1ms的计数器,用来1ms接收一次按键的输入值,达到按键消抖的目的。key_cnt用于1ms计数器。key_out为消抖后的按键的输出值。
(2)电机速度调节、
默认占空比为0.9,当key3按下时,减少pwm波的占空比,达到使电机减速的目的。当按下key2时,增加pwm波的占空比,达到使电机加速的目的。同时对占空比设置一个可调节的上下范围。
(3)电机转动方向调节
Key1用于调节电机的转动方向。原理是切换pwm波输出的引脚。每按下一次key1按键,电机的转向发生一次改变。
4,pwm波形产生模块
硬件设计
每路寄存器都有独立的寄存器用于参数设置和模块的控制。波形占空比控制是基于时钟数来控制的。
基于计数器的PWM波形发生器,在不工作时,该模块要停止计数,用以降低功耗。
(2)参数寄存器:
波形周期数寄存器
波形高电平周期数寄存器
(3)控制寄存器:
总的使能信号,该信号无效时,整个模块不工作。
单路使能寄存器,用于控制每一路有效。信号有效时,启动该路模块,否则关闭该路模块。
具体的代码实现:
(1) 接收占空比参数。该参数来自于上层控制模块的输入。
(2)计数器。用于记录pwm周期。并产生pwm波形。
(3)pwm波输出使能。
当输出使能信号pwm_out_en为1时,输出pwm波形信号。当该是能信号为0时,pwm输出一直为0.
四,工程源码+演示效果
在公众号【数字积木】对话框中回复
PWM
即可看到演示视频和工程源码下载链接。