查看: 655|回复: 0

[教程] 30..STM32F469I---简易示波器--STemWin+AD采样+画图

[复制链接]

主题

好友

7154

积分

状元

  • TA的每日心情
    郁闷
    17 小时前
  • 签到天数: 793 天

    连续签到: 88 天

    [LV.10]以坛为家III

    发表于 2018-1-12 20:08:35 |显示全部楼层
    【STM32F469I试用】+简易示波器【转】

    (一)STemWin+画图

    STM32F469Discovery
    STM32F469NIH6微控制器,采用BGA216封装
    16MB SDRAM、16MB SPI Nor Flash
    USB OTG FS
    MicroSD卡、I2C扩展接口
    SAI音频DAC,一个立体声耳机输出接口
    3个MEMS数字麦克风
    SDRAM、四通道SPI闪存
    4.0英寸带电容屏的彩色LCD-TFT,分辨率800*480
    4个LED指示灯、用户按钮、复位按钮
    Arduino UNO扩展接口
    板载ST-LINK/ V2-1,提供了一个嵌入式调试器和编程的STM32微控制器,支持mbed
    这么好的资源不能浪费,我想利用这个板子做一个简易示波器,实现我们弱电的检测。
    从拿到板子开始学习LCD显示屏资料,想从HAL库中的LCD驱动移植到DSP库中,不过由于以前一直用的DSP库,没有用过HAL库,又由于时间比较急,所以还是放弃了,
    直接使用HAL库中的例程更改(等活动过了有时间在移植DSP库驱动);
    现在也是刚刚学习STemWin,很多都还不会,只能慢慢来了,今天先学习画sin和cos曲线。

    1.jpg


    2.jpg


    main.rar (3.53 KB, 下载次数: 1, 售价: 1 铜板)

    =================================================

    (二)AD采样+画图

    简易示波器功能描述:

    1.测量直流信号、交流信号的电压幅度;

    2.测量交流信号的周期,并计算频率;

    3.显示交流信号波形;

    4.波形的放大和缩小;

    5.···········

    暂时就先实现以上几个简单的基本功能,STM32芯片是3.3V供电,AD采样也只有0-3.3V,前端没有做硬件电路,所以这些测量暂时都是0-3.3V;

    目前实习功能:AD采样和显示;

    实现过程:(我以前都是用STM32的DSP库开发,而STM32F469Discovery的DSP库的显示驱动还没有,所以我暂时只能在HAL库上进行开发,所以很多东西都不是很熟悉,而实现的功能也是大多基于

    官方的例程开发,望各位路过大神多多指点,谢谢!)

    首先,在官方库路径:stm32cubef4\Projects\STM32469I-Discovery\Applications\STemWin中以Hello World为模版进行开发

    1.去掉例程中的BASIC_HelloWorld文件,以及main.c中的MainTask子程序,然后就可以开始自己的编程了;

    如图:

    11.jpg


    2.新建一个空白文件,作为C文件,用作ADC初始化的C文件,这里C文件也直接从在官方库路径:stm32cubef4\Projects\STM32469I-Discovery\Examples\ADC\ADC_RegularConversion_DMA中的Src文件中的main.c中找到自己需要的代码
    然后在main函数中添加ADC相关的代码:
    其他就是关于ADC的宏定义,按照例程中的复制到main.h文件中,
    在mian.c中定义一个uint16_t uhADCxConvertedValue[500] ={ 0};用作存ADC采样值在把DMA中数据改为半字
      hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;//DMA_PDATAALIGN_WORD;
      hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;//DMA_MDATAALIGN_WORD;;

    到这里ADC就差不多改好了
    然后就是用STemWin画图了,这个GUI我也是初次使用,所以也是在摸索中,具体有些什么经验也谈不上,所以就不过多叙说了
    GUI_SetBkColor(GUI_BLACK);

    GUI_Clear();

    GUI_SetColor(GUI_WHITE);

    GUI_SetFont(&GUI_Font8x16);

    设置背景色、字体颜色和字体

    for(i = 40; i<=440; i = i+80)
            {
              GUI_DrawHLine(i,50,550);
                    GUI_GotoXY(30,i-8);
              GUI_DispDec(y_lable[5-(i-40)/80],1);
            }
            for(i = 50; i<=550; i = i+100)
            {
              GUI_DrawVLine(i,40,440);
                    GUI_GotoXY(i-8,450);
              GUI_DispDec(x_lable[(i-50)/100],3);
            }
    画背景网格
    for(i = 0; i<500;i++)
            {
                    y3 = 440-(80*3.3*uhADCxConvertedValue/4095);
                    GUI_SetColor(GUI_GREEN);
                    GUI_DrawPoint(x+50,y3);
            }

    画函数曲线,效果如下:
    ADC接3.3V时:

    12.jpg


    ADC接GND时:

    13.jpg


    如果ADC悬空:

    14.jpg


    为什么会这样呢?因为我使用的画点函数,每次画上去都没有清楚,所以当ADC在0-3.3V跳变时,就会一直画很多点,就是这个效果了
    ADC使用的引脚和接线如图:

    15.jpg


    附上adc.c和main.c文件
    Src.rar (5.18 KB, 下载次数: 6, 售价: 1 铜板)
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网

    GMT+8, 2018-12-13 17:55 , Processed in 0.110514 second(s), 14 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部