毕设分享|基于51单片机PWM信号输出控制器设计

随着电子技术的快速发展,脉宽调制控制技术逐渐成熟,主要应用于电力电子技术行业。模拟控制方式产生的脉宽调制(PWM)信号,根据相应负载的变化,调制晶体管基极或MOS管栅极的偏置,从而实现晶体管或MOS管导通时间的变化,最终实现开关稳压电源输出的变化,产生PWM信号,复杂且成本高。用单片机产生脉宽调制信号简单、方便、成本低。

第一章 方案论证

STM32F103的ARM芯片被本项目硬件系统设计采用,程序的编写应用keilMDK4.53,结合STM32V3.5标准库。写好程序,调试运行没问题后下载进入单片机。通过示波器记录实验结果。系统结构图如下图所示。

图1 系统结构图

单片机通上电之后,输出并且由示波器检测到PWM信号,用户可由按键可以控制其输出。

1.1 产生PWM信号方案论证

PWM波在直流电机调速经常被使用,在机械装置控制、机器人应用等行业被大量涉及,这里讲解几种PWM的制备方法:第一种方法是直接控制单片机时钟模块,通过使用中断来实现,PWM波参数可以很容易被设置;第二种方法是用555时基电路产生PWM波,硬件电路简单,但调试要小心;第三种方法是采用积分电路获得PWM波,然后经过迟滞比较器,这种方法电路相对复杂,电路调试也需要经验。选择方法时,请注意组件的细微差别以及温度漂移造成的影响。

①利用单片机内部的PWM波电路产生

单片机利用内部晶振产生PWM波,具备两路PWM输出,适用于各种干扰较强的场合使用。stm32将定时器设置成PWM模式需要通过程序,然后就可以产生相应频率、相应占空比的PWM波。

②555时基电路产生PWM波

因为内部有定时触发电路的存在,555时基电路只需要在外部搭建脉冲产生电路就可以触发内部时基电路,从而输出不同频率和占空比的方波。555时基电路于1971年首次引入,其使用比较容易、制作成本不高的特性,使得该芯片到今天为止大量应用于各种电路设计中。当我们需要产生频率和占空比可变的PWM波,通过改变555时基电路外面的电阻和电容就可以实现。555时基电路如图

 图2 555时基电路

555时基电路产生PWM波包含单稳态触发器,所以他具有以下的特征:首先,它具有稳定和暂稳状态;其次,当从外部加上触发脉冲时,可以从稳定状态转换成暂稳状态;第三,经过一段时间后,暂时稳定状态自动返回到稳定状态,该状态的持续时间独立于触发脉冲,仅由电路本身的参数决定。数字系统和设备中的这种电路通常用于同步(以产生特定宽度的方波)、整形(以将不规则波形转换成具有相等宽度和幅度的脉冲)和延迟(以在输入信号延迟一段时间后输出)。

③运算放大器产生PWM波

此节讲述的是利用带滞回比较器的级联和反向积分运算电路产生PWM波的情况,并且可以调节PWM波频率和占空比等工作系数。

图3 反向比例积分器电路

图4 方波经反向比例积分器得到的三角波

1.2 参数储存器模块的方案论证

储存器可以分为很多种,按是否易失分为是易失存储器和非易失存储器。而对于十分重要的参数储存器要求数据能一直保存,即使掉电后数据依然保存的非易失存储器。参数储存器的选择多种多样,各有各的优点,用户可根据条件择优选取。以下介绍三种参数储存器方案,分别是SD卡、EEPROM和EEPROM。

①EEPROM

EEPROM(ElectricallyErasableProgrammableROM)是电可擦除储存器。EEPROM是由电路来控制擦除和写入,所以写入和擦除不受次数的限制。它按字节为单位修改数据,处理数据时更方便。

②Flash存储器

Flash存储也是比较受欢迎的存储器,由于它可以重复擦写和容量大的特点,目前被广泛使用。和EEPROM相比最大的区别就是Flash必须按块擦除。其另一大应用领域用作硬盘驱动器的替代品,具有抗震、高速、无噪声和低功耗的优点。有的时候它也被称为闪存。

但对于单片机FLASH有一定的擦除、写入次数,一般的单片机的FLASH擦除写入次数的标称值是10000次。此外FLASH写入数据需要比较长的时间,大约需要4-6ms.而且写FLASH需要加上9V的高压,麻烦。所以单片机不适合采用Flash储存。

第二章  理论分析与计算

PWM波其实就是一连串的的方波,这些方波就是由一个周期内的高低电平来构成的。用单片机控制的PWM波改变的就是方波的频率和周期内电平的翻转时间,所以PWM波最重要的两个参数分别时周期和占空比。为了保证PWM信号的可靠性必需对单片机内部定时器、计数器器和输出比较进行配置。

2.1 输出频率的计算

下面我们来讲解PWM1模式,由于计数器CNT计数的方向不同,还分为边沿对齐、中心对齐模式。PWM信号主要都是用来控制电机,一般的电机控制用的都是边沿对齐模式,FOC电机一般用中心对齐模式。

图5 PWM模式的边沿对齐波形

第三章   硬件设计

根据系统结构图,系统由:信号输出电路、储存模块电路、单片机最小系统电路组成。

3.1 信号输出电路

这个电路是用来输出高低电平的,它的优点是负载能力和开关速度都比普通方式有很大提高,稳定性好。

图6   推挽等效电路

所谓的推挽输出模式是根据这两个MOS管的工作方式来命名的。当高电平输入该结构时,经上方的P-MOS导通后,下方的N-MOS关断,向外输出高电平;而当本结构输送低电平时,经过反向后,N-MOS管导通、P-MOS管关闭,向外输出低电平。当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。

3.2 单片机最小系统电路图

单片机最小系统就是使单片机能够实现简单运行的最少元件组合,括晶振电路、复位电路、电源电路,电路如图所示

图7 单片机最小系统电路图

第四章  软件设计

通过程序实现占空可调的PWM波,要求实现在上电后自动读取上一次保存的占空比并输出对的应PWM波,当输出通道打开时能自由切换通道1和通道2,如果一个通道处于输出状态,另一个通道就必须处于关闭状态。当信号从某一通道输出时,按通过键可以改变输出占空比的值,并且每按一次按键占空比增加10%,最后把当前占空比的值保存到EEPROM。当需要停止输出时,也可以通过按键停止信号输出功能。根据系统软件设计要求将软件划分为:主程序,储存模块。

4.1 主程序

主程序完成EEPROM的读写,初始化按键、PWM模块,实现按键改变占空比比

图8 程序流程图

4.2 EEPROM读写子程序

EEPROM读程序将EEPROM中的有用数据读出来,EEPROM写程序是将有用的数据写入EEPROM中,这样就可以在单片机掉电后再次使用

图9 EEPROM读写程序流程图

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机设计智能信号发生器,通过按键控制输出形的设计思路如下: 1. 初始化各个模块,包括输入模块、输出模块、形生成模块、频率调节模块、幅度调节模块和显示模块。 2. 通过按键输入控制信号,根据用户输入控制信号选择相应的形类型。可以设计多个按键分别对应不同的形类型。 3. 循环读取用户输入或其他控制信号,根据用户输入或其他控制信号调节信号的频率和幅度,并生成相应的信号形。 4. 将生成的信号输出到外部电路中。 5. 显示当前输出信号形、频率、幅度等参数。 6. 循环执行以上步骤,直到程序停止或用户结束操作。 具体的程序设计需要根据实际需求和硬件设计来确定。下面是一个基于51单片机设计智能信号发生器,通过按键控制输出形的参考代码: ``` #include <reg51.h> sbit wave1Key = P0^0; // 按键1 sbit wave2Key = P0^1; // 按键2 sbit wave3Key = P0^2; // 按键3 // 定义形类型 #define SINE_WAVE 0 #define SQUARE_WAVE 1 #define TRIANGLE_WAVE 2 // 定义形生成参数 unsigned int freq = 1000; // 初始频率为1KHz unsigned char amp = 50; // 初始幅度为50% unsigned char waveType = SINE_WAVE; // 初始形为正弦 // 定义输入、输出、显示等模块的初始化函数 void initInputModule() { // 初始化输入模块 } void initOutputModule() { // 初始化输出模块 } void initWaveformModule() { // 初始化形生成模块 } void initFrequencyModule() { // 初始化频率调节模块 } void initAmplitudeModule() { // 初始化幅度调节模块 } void initDisplayModule() { // 初始化显示模块 } // 定义形类型选择函数 void selectWaveType() { if (wave1Key == 0) { // 按键1对应的形类型 waveType = SINE_WAVE; } else if (wave2Key == 0) { // 按键2对应的形类型 waveType = SQUARE_WAVE; } else if (wave3Key == 0) { // 按键3对应的形类型 waveType = TRIANGLE_WAVE; } } // 定义形生成函数 void generateWaveform() { // 根据当前的频率、幅度和形类型生成相应的信号形 } // 主函数 void main() { // 初始化各个模块 initInputModule(); initOutputModule(); initWaveformModule(); initFrequencyModule(); initAmplitudeModule(); initDisplayModule(); // 进入主循环 while (1) { // 选择形类型 selectWaveType(); // 读取用户输入或其他控制信号 // 根据用户输入或其他控制信号调节信号的频率和幅度 // 生成相应的信号形 generateWaveform(); // 将生成的信号输出到外部电路中 // 显示当前输出信号形、频率、幅度等参数 } } ``` 上述代码仅为参考,具体实现需要根据实际需求和硬件设计来确定。需要注意的是,在编写代码时需要注意代码的可维护性和可扩展性,以便后续的维护和升级。同时需要注意按键的防抖设计,以避免误操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值