• 基于stm32单片机的信号发生器设计


    硬件方案

          硬件主要由stm32单片机核心板+LCD1602液晶显示屏+LM358运算放大电路+DAC0832数模电路+TL431基准参考电压电路+ICL7660稳压电路+按键电路等构成;如图:

     

    设计功能

    1.LCD1602液晶显示波形种类和频率值(0-50KHZ)。

    2.按键可用于设置波形种类和设定频率步进值;

    3.电位器器改变振幅0-5V(2V-4V稳定)。

    4.共可产生4种波形,分别为正弦波、锯齿波、三角波、矩形波。

    5.有四个指示灯用于分别对应四种波形,指示当前系统发出的是哪种信号波形。

    设计原理图

            硬件电路使用Altium Designer 15设计完成。主要包括STM32主控电路,DAC0832电路,稳压电路,按键电路,串口电路,显示电路。,如图:

           整体硬件采用DDS和单片机技术相结合,以STM32F103C8T6芯片及DAC0832为核心设计了一种幅度、相位、频率都可调节的信号发生器,它不仅能克服传统的正弦波信号发生器的缺点,而且由模拟乘法器产生调幅电路、采用数字键控的方法实现二进制PSK、ASK信号,且信号频带较宽、以及频率稳定度高,输出的信号波形良好。 

            PCB图如下:

     

    软件设计

            本系统的软件设计采用C语言,对STM32单片机功能代码进行编程实现各项功能。采用KEIL软件编写,可以实现波形的切换、幅度频率的调节以及方波的占空比调节、液晶显示等功能。

        主程序主要起到一个导向和决策功能,运行的是整体的功能,通过调用各个子模块的驱动函数以实现整体功能。其余各种功能的实现主要通过具体的子程序来完成。程序流程图如下:


    主程序源码 

    1. int main(void)
    2. {       
    3.   int a=1,b=0,c=0,d=0,e=0,zkb_s=5,zkb_g=0; 
    4.   u16 n;             
    5.   Stm32_Clock_Init(10);   //系统时钟设置
    6.   delay_init(128);    //延时初始化
    7.   dac_creat_buf();
    8.   LCD_init(); 
    9.   KEY_Init();   
    10.   Dac1_Init();       //DAC通道1初始化   
    11.   Timerx_Init(255,0);     //256分频 500K的中断频率
    12.   LCD_write_string(1,1," zhankongbi=00% ");  
    13.   LCD_write_string(2,1," Sin f= 00000HZ "); 
    14.   M=8589.93452*data_f;    
    15.   while(1)//1:右,2:上,3:左,4:下, 5:中      
    16.   {   
    17.     KEY_Scan();        //按键扫描函数  
    18.     if(Data_key==3)        //左键,设置频率
    19.     {
    20.       KEY5_num=0;
    21.       KEY3_num++;
    22.       if(KEY3_num>=6)
    23.         KEY3_num=0;
    24.     }
    25.     else if(Data_key==1)  //右键,切换波形
    26.     {
    27.       KEY5_num=0;
    28.       KEY1_num++;
    29.       if(KEY1_num>=4)
    30.         KEY1_num=0;
    31.       //设置波形及显示波形种类
    32.       if(KEY1_num==0)
    33.       {
    34.         wave=0;LCD_write_string(2,1," Sin ");
    35.       }
    36.       else if(KEY1_num==1)
    37.       {
    38.         wave=1;LCD_write_string(2,1," Tri " );
    39.       }  
    40.       else if(KEY1_num==2)
    41.       {
    42.         wave=2;LCD_write_string(2,1," Saw ");
    43.       }
    44.       else if(KEY1_num==3)
    45.       {
    46.         wave=3;LCD_write_string(2,1," squ ");
    47.       }
    48.     }
    49.     else if(Data_key==5) //中键,设置占空比
    50.     {
    51.       KEY3_num=0;
    52.       KEY5_num++;
    53.       if(KEY5_num>=3)
    54.         KEY5_num=0;
    55.     }
    56.     ...
    57.   }
    58. }

    链接:https://pan.baidu.com/s/1CG9bi8EC3jOuhDFzGd1mIg?pwd=3wq1 
    提取码:3wq1

  • 相关阅读:
    记一次相同sql语句,java中执行不成功,数据库中能执行成功的问题
    《uni-app》表单组件-Input组件
    CockroachDB-备份与恢复(6)RESTORE命令
    Redis文件事件模型
    云计算-桌面云-国产-华为-FusionAccess+HCIE Cloud相关知识点+笔试题库
    Spring Boot 基础使用
    网络编程之NIO 基础
    thinkphp5 注入 反序列化写文件 phar反序列化
    电脑被删除的文件怎么恢复?2023年数据恢复方法分享
    java开发环境从0开始 【汇总版】
  • 原文地址:https://blog.csdn.net/eletronicfish/article/details/127562605