查看: 2522|回复: 0

GD32207I_EVAL之DAC产生正弦波,ADC读取并显示在屏幕上之抛砖引玉

[复制链接]
  • TA的每日心情
    慵懒
    2022-10-25 08:55
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2016-10-31 09:05:26 | 显示全部楼层 |阅读模式
    分享到:
    入手这块板子已经块一月了,爱板网小妹已经催我归还了。想想时间还过的真快。最近看到好多用STM32做的示波器的帖子,不禁有感而发,对于电子硬件人员来说,最可贵的不是对硬件本身的掌握(当然这个很重要,是基础),而是想法上的创新,。敢想敢做大胆实验,才是一个真正的电子硬件人员的真正特点。言归正传,GD32207I这块板子最显著的就是自带了摄像头模块,本想写一篇关于摄像头的实验,无奈,发我的这块不知道是不是光感元件出了点问题,影像模糊不清。但板子资源丰富,我们还可以找其他乐趣。GD32207自带12ADC和12DAC,配置中规中矩,但做什么简易波形发生器,简易波形显示那绝对绰绰有余。
    先看下ADC电路图部分

    可见这里简易的连接到了一个分压电路上,调节电位器,就可以得到不同的电压,这样就可以验证ADC的采样实验了。
    我们看到它有个测试点TP2直接连接的是ADC输入引脚。
    再看下DAC电路部分:

    注意;得把JI2,J22的跳帽接到DAC这端。然后JP7上1,2引脚就直连ADCOUT1和2了。
    这样我们的实验就开始了,我们的目的是:让DAC2输出正弦波,然后送给ADC,然后让采集的波形显示在LCD上面。当然都是最基本的程序改的。
    例程里面自带的DAC程序稍作修改就可以输出正弦波什么的各种波形。我们新定义一个显示正弦波的数组sine[100],赋给DAC_SetDualDACData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)函数里的Data2.。然后让它在一个循环里不数组的值逐个赋给DAC_SetDualDACData()函数即可。用示波器可以 直接看到引脚输出的正弦波。当然你也可以用ADC+DMA来完成,释放CPU。
    具体如下:
    //正弦波数组定义:
    const u32 Sine12bit[100] = { 0x7FF,0x880,0x900,0x97F,0x9FC,0xA78,0xAF1,0xB67,0xBD9,0xC48,0xCB2,0xD18,0xD79,0xDD4,0xE29,0xE77
    ,0xEC0,0xF01,0xF3C,0xF6F,0xF9A,0xFBE,0xFDA,0xFEE,0xFFA,0xFFE,0xFFA,0xFEE,0xFDA,0xFBE,0xF9A,0xF6F
    ,0xF3C,0xF01,0xEC0,0xE77,0xE29,0xDD4,0xD79,0xD18,0xCB2,0xC48,0xBD9,0xB67,0xAF1,0xA78,0x9FC,0x97F
    ,0x900,0x880,0x7FF,0x77E,0x6FE,0x67F,0x602,0x586,0x50D,0x497,0x425,0x3B6,0x34C,0x2E6,0x285,0x22A
    ,0x1D5,0x187,0x13E,0x0FD,0x0C2,0x08F,0x064,0x040,0x024,0x010,0x004,0x000,0x004,0x010,0x024,0x040
    ,0x064,0x08F,0x0C2,0x0FD,0x13E,0x187,0x1D5,0x22A,0x285,0x2E6,0x34C,0x3B6,0x425,0x497,0x50D,0x586
    ,0x602,0x67F,0x6FE,0x77E};
    //在主循环里的循环
    for(i=0;i<=100;i++)
    {
      if(i==100)
    i=0;
            DAC_SetDualDACData(DAC_ALIGN_12B_L,Sine12bit*10,Escalator8bit[i%6]);
    Delay_1ms(10);
    ADCValueDisplay_MainLoop();//显示电压值
        ADCWaveformDisp_MainLoop(); //波形显示
    }
    ///////
    ADC部分,配置部分保留原程序的配置不变,LCD的程序稍许变化:定义几个函数:
    void TP_Config(void)
    {
    LCD_Clear(LCD_COLOR_WHITE);
        LCD_SetFont(&Font8x8);
      LCD_SetTextColor(LCD_COLOR_YELLOW);
        LCD_DisplayStringLine(LINE(30), (uint8_t*)"                                          Touch Panel Paint");
        LCD_DisplayStringLine(LINE(32), (uint8_t*)"                                          Example          ");
        LCD_SetTextColor(LCD_COLOR_RED);
        LCD_DrawFullRect(5, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_BLUE);
        LCD_DrawFullRect(40, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_GREEN);
        LCD_DrawFullRect(75, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_BLACK);
        LCD_DrawFullRect(110, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_MAGENTA);
        LCD_DrawFullRect(145, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_BLUE2);
        LCD_DrawFullRect(180, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_CYAN);
        LCD_DrawFullRect(215, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_YELLOW);
        LCD_DrawFullRect(250, 238, 30, 30);
        LCD_SetTextColor(LCD_COLOR_BLACK);
        LCD_SetFont(&Font16x24);
        LCD_DisplayChar(LCD_LINE_10, 292, 0x43);
        LCD_DrawLine(0, 232, 480, LCD_DIR_HORIZONTAL);
        LCD_DrawLine(1, 232, 36, LCD_DIR_VERTICAL);
        LCD_DrawLine(37, 232, 36, LCD_DIR_VERTICAL);
        LCD_DrawLine(72, 232, 36, LCD_DIR_VERTICAL);
        LCD_DrawLine(107, 232, 36, LCD_DIR_VERTICAL);
        LCD_DrawLine(142, 232, 36, LCD_DIR_VERTICAL);
    LCD_DrawLine(177, 232, 36, LCD_DIR_VERTICAL);
    LCD_DrawLine(212, 232, 36, LCD_DIR_VERTICAL);
    LCD_DrawLine(247, 232, 36, LCD_DIR_VERTICAL);
    LCD_DrawLine(282, 232, 36, LCD_DIR_VERTICAL);
    LCD_DrawLine(317, 232, 36, LCD_DIR_VERTICAL);
        LCD_DrawLine(1, 269, 480, LCD_DIR_HORIZONTAL);
    }
    //界面初始化显示
    static void LCD_GUIDisplay(void)
    {
    uint16_t i;
      LCD_SetLayer(LCD_BACKGROUND_LAYER);//设置为背景层
      LCD_SetTransparency(255);  //背景层透明度
      LCD_Clear( ((220>>3)<<11)|((220>>2)<<5)|(220>>3) );//把LCD清除为指定颜色
    LCD_SetBackColor(LCD_COLOR_BLUE);
      LCD_SetTextColor(LCD_COLOR_BLACK);
    LCD_DrawFullRect(20, 29, 400, 219);
    LCD_SetTextColor( ((180>>3)<<11)|((180>>2)<<5)|(180>>3) );
    LCD_DrawRect( 20, 29, 219, 400);
    LCD_SetTextColor( ((180>>3)<<11)|((180>>2)<<5)|(180>>3) );
    LCD_DrawUniLine( 19, 28, 419, 28);
    LCD_DrawUniLine( 19, 28, 19, 248);
    LCD_SetTextColor( ((128>>3)<<11)|((128>>2)<<5)|(128>>3) );
    LCD_DrawUniLine( 20, 29, 418, 29);
    LCD_DrawUniLine( 20, 29, 20, 247);
    LCD_SetTextColor( 0XFFFF );
    LCD_DrawUniLine( 420, 29, 420, 249);
    LCD_DrawUniLine( 20, 249, 420, 249);
    LCD_SetTextColor( ((30>>3)<<11)|((30>>2)<<5)|(30>>3) );
    for( i=49; i<249; i+=20 )
    LCD_DrawUniLine( 21, i, 418, i);
    for( i=44; i<418; i+=38 )
    LCD_DrawUniLine( i, 30, i, 247);
        LCD_SetBackColor(((220>>3)<<11)|((220>>2)<<5)|(220>>3));
        LCD_SetTextColor(LCD_COLOR_BLUE);
    LCD_SetFont(&Font8x16);
    LCD_DisplayStringLine(LCD_LINE_0, (uint8_t*)MESSAGE1);
    //LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE1_1);
    LCD_SetLayer(LCD_FOREGROUND_LAYER);//把LCD设置为前景显示层
    LCD_SetTransparency(80);//前景层透明度
    LCD_Clear( LCD_COLOR_BLACK );
    }
    //LCD显示电压值主循环
    static void ADCValueDisplay_MainLoop(void)
    {
      float uwVoltage =0, uwMVoltage=0;
      uint8_t aTextBuffer[50];
    //把ADC采样值转换成电压值
      uwADC3ConvertedVoltage = uhADC3ConvertedValue *3300/0xFFF;
    LCD_SetLayer(LCD_BACKGROUND_LAYER);
      LCD_SetBackColor(((220>>3)<<11)|((220>>2)<<5)|(220>>3));
      LCD_SetTextColor( LCD_COLOR_BLUE );
      uwVoltage = (uwADC3ConvertedVoltage)/1000;
    //  uwMVoltage = (uwADC3ConvertedVoltage00)/100;
      sprintf((char*)aTextBuffer, MESSAGE5, uwVoltage);
      LCD_DisplayStringLine(LCD_LINE_16, (uint8_t*)aTextBuffer);
    LCD_SetLayer(LCD_FOREGROUND_LAYER);
    }
    //电压波形显示主循环
    static void ADCWaveformDisp_MainLoop(void)
    {
    DrawData = uhADC3ConvertedValue*(200.000/0xFFF);  
    if( ++Counter == 4 )
    {
    Counter = 0;
    LCD_SetTextColor( LCD_COLOR_BLACK );
    LCD_DrawFullRect( Xpos+1, 50, 2, 218);
    LCD_SetTextColor( LCD_COLOR_GREEN );
    Xpos=Xpos+1;
    if(Xpos>418)
    {
    Xpos=21;
    LCD_SetTextColor( LCD_COLOR_BLACK );
    LCD_DrawLine( Xpos, 50, 218, LCD_DIR_VERTICAL);
    LCD_SetTextColor( LCD_COLOR_GREEN );
    }
    Xpos2=Xpos2+1;
    Ypos2=249-DrawData;
    if(Xpos2>418)
    {
    Xpos2=21;Xpos1=21;
    }
    LCD_DrawUniLine( Xpos1, Ypos1, Xpos2, Ypos2);
    Xpos1=Xpos2;
    Ypos1=Ypos2;
    }
    }
    如果没看明白,最后会给出源程序。
    这样就可以,直接上效果图:



    可以看到我们DAC产生的正弦波,被ADC转换后在LCD上显示了。
    这只是一个很简单的程序,但如果扩展的好的话,那就不一般了,可以做个简易的示波器吧。呵呵,所以就算简单的抛砖引玉吧(高手勿喷)。就讲到这了。
    我去!竟找不到上次附件这个功能。这版本搞的也太差劲了吧。上传到百度云吧,有兴趣的可以看看,无兴趣的请无视。
    链接:https://pan.baidu.com/s/1geTgAMf 密码:dda5
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 14:10 , Processed in 0.118048 second(s), 17 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.