TA的每日心情 | 慵懒 2022-10-25 08:55 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
|
入手这块板子已经块一月了,爱板网小妹已经催我归还了。想想时间还过的真快。最近看到好多用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 |
|