5回答

0收藏

基于GD32F190的模拟信号采集与显示装置设计

GD32 GD32 5073 人阅读 | 5 人回复 | 2016-06-07

一、方案名称:  
基于GD32F190的模拟信号采集与显示装置设计
二、方案介绍
   
GD32F190的内部配有12位精度的模数转换器,可对外部16个模拟输入通道进行模拟信号采集。利用该性能,可以较好地对各种模拟信号量加以处理。
为了能使开发者较好地掌握对A/D转换器的使用,在推出的相关资源中,有对应的例程可参考使用。由于相关资料是介绍自家产品的,因而在应用中,开发者还需配置第三方的器件,才能使设计的功能更加便于使用。这里就介绍一种以OLED为显示器件对模拟信号进行显示输出的方案。
在该方案中,所用的显示屏为双色的0.96 ’ OLED,其上部的1/3为黄色,另2/3为蓝色。为了便于功能的扩展,在程序设计过程中,保留了开发板所具备的虚拟串口通讯功能。这样既可以通过串行通讯来同上位机构成数据采集分析系统;也可以通过外挂相应的通信模块来实现无线通讯或WiFi通讯,从而融入互联网的行列中。当然,核心的功能则是射频和串口之间的透传。
三、设计结构
   
该方案的系统结构如图1所示,其装配图如图2所示。
四、功能设计
在设计中,对显示器件的选择是有一定特色的,它虽与同档次LCD5110液晶屏在功能上十分相近,但它的特色却极为抢眼。
首先,在外形上它更为迷你,是穿戴性设备的理想选择对象;在工作机制上,LCD5110是依赖背光的投射来看清显示的内容,而OLED则是靠自身的点亮来发光;在色彩方面它也由LCD5110的单一色调,而变为黄、蓝两种醒目的颜色,有效地增强了表现力。
另外,在引脚使用方面它也胜出一筹,LCD110 要占用8个引脚,而OLED则只需4个引脚。在数据传送方面,它是以IIC总线方式。在应用中是由PA7来连接OLED的数据信号,由PA8来连接OLED的时钟信号。其输出高低电平的定义语句如下:
#defineOLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_PIN_8)//SCL
#defineOLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_PIN_8)
#defineOLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_PIN_7)//SDA
#defineOLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_PIN_7)
2个引脚的配语句如下:
GPIO_InitPara  GPIO_InitStructure;
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA,ENABLE);  
  GPIO_InitStructure.GPIO_Pin =GPIO_PIN_8|GPIO_PIN_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
  GPIO_InitStructure.GPIO_Speed =GPIO_SPEED_50MHZ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_PIN_8|GPIO_PIN_7);     
    至于各功能函数直接引用OLED的例程即可,但要注意对数据类型的定义语句稍加调整,如要把u8改为uint8_t 等。
    为了便于显示数据及字符信息,在程序中配置了2中整体,及6*8的点阵字符和8*16的点阵字符。
const unsignedchar F6x8[][6] =            
{
0x00, 0x00,0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00,0x00, 0x2f, 0x00, 0x00,// !
。。。
}
const unsignedchar F8X16[]=     
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//sp
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!
。。。
}
此外,使用字模提取软件PCtoLCD2002还可自行构建小字库来显示中文,该软件的界面如图3所示。

系统流程图

程序设计
主函数的程序代码如下:
  1. int main(void)
  2. {
  3.     RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA |
  4.                                RCC_AHBPERIPH_GPIOB |
  5.                                RCC_AHBPERIPH_GPIOC |
  6.                                RCC_AHBPERIPH_GPIOF, ENABLE );
  7.     delay_init(72);
  8.     /* USART initialize */
  9.     {
  10.         USART_InitPara  USART_InitStructure;
  11.         USART_DeInit( EVAL_COM1 );        
  12.         USART_InitStructure.USART_BRR                 = 115200;
  13.         USART_InitStructure.USART_WL                  = USART_WL_8B;
  14.         USART_InitStructure.USART_STBits              = USART_STBITS_1;
  15.         USART_InitStructure.USART_Parity              = USART_PARITY_RESET;
  16.         USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
  17.         USART_InitStructure.USART_RxorTx              = USART_RXORTX_RX | USART_RXORTX_TX;
  18.         GD_EVAL_COMInit(&USART_InitStructure);
  19.     }
  20.                 OLED_Init();                          
  21.                 OLED_Clear();
  22.                 OLED_ShowCHinesea(18,0,0);  
  23.                 OLED_ShowCHinesea(36,0,1);
  24.                 OLED_ShowCHinesea(54,0,2);
  25.                 OLED_ShowCHinesea(72,0,3);
  26.                 OLED_ShowCHinesea(90,0,4);
  27.                 OLED_ShowString(18,6,"3.30  V",16);
  28.                 {
  29.          {
  30.             RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6);
  31.             RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_DMA1 , ENABLE);
  32.             RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_ADC1, ENABLE);
  33.             RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2, ENABLE);
  34.         }
  35.          {
  36.             GPIO_InitPara GPIO_InitStructure;
  37.             /* Configure PC0 (ADC Channel 10) as analog input  */
  38.             GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_0;
  39.             GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AN;
  40.             GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
  41.             GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
  42.             GPIO_InitStructure.GPIO_Speed   = GPIO_SPEED_50MHZ;
  43.             GPIO_Init(GPIOC, &GPIO_InitStructure);
  44.         }
  45.             {
  46.             DMA_InitPara DMA_InitStructure;
  47.             DMA_DeInit( DMA1_CHANNEL1 );
  48.             DMA_InitStructure.DMA_PeripheralBaseAddr    = (uint32_t)&ADC1->RDTR ;
  49.             DMA_InitStructure.DMA_MemoryBaseAddr        = (uint32_t)AD_Value;
  50.             DMA_InitStructure.DMA_DIR                   = DMA_DIR_PERIPHERALSRC;
  51.             DMA_InitStructure.DMA_BufferSize            = 220;
  52.             DMA_InitStructure.DMA_PeripheralInc         = DMA_PERIPHERALINC_DISABLE;
  53.             DMA_InitStructure.DMA_MemoryInc             = DMA_MEMORYINC_ENABLE;
  54.             DMA_InitStructure.DMA_PeripheralDataSize    = DMA_PERIPHERALDATASIZE_HALFWORD;
  55.             DMA_InitStructure.DMA_MemoryDataSize        = DMA_MEMORYDATASIZE_HALFWORD;
  56.             DMA_InitStructure.DMA_Mode                  = DMA_MODE_CIRCULAR;
  57.             DMA_InitStructure.DMA_Priority              = DMA_PRIORITY_HIGH;
  58.             DMA_InitStructure.DMA_MTOM                  = DMA_MEMTOMEM_DISABLE;
  59.             DMA_Init( DMA1_CHANNEL1 , &DMA_InitStructure);
  60.             DMA_Enable( DMA1_CHANNEL1 , ENABLE);
  61.         }
  62.         {
  63.             TIMER_BaseInitPara TIM_TimeBaseStructure;
  64.             TIMER_OCInitPara   TIM_OCInitStructure;
  65.             TIMER_BaseStructInit( &TIM_TimeBaseStructure );
  66.             TIM_TimeBaseStructure.TIMER_Period          = 200;         
  67.             TIM_TimeBaseStructure.TIMER_Prescaler       = 5;      
  68.             TIM_TimeBaseStructure.TIMER_ClockDivision   = 0x0;   
  69.             TIM_TimeBaseStructure.TIMER_CounterMode     = TIMER_COUNTER_UP;  
  70.             TIMER_BaseInit( TIMER2, &TIM_TimeBaseStructure );
  71.             TIM_OCInitStructure.TIMER_OCMode            = TIMER_OC_MODE_PWM1;
  72.             TIM_OCInitStructure.TIMER_OutputState       = TIMER_OUTPUT_STATE_ENABLE;               
  73.             TIM_OCInitStructure.TIMER_Pulse             = 100;
  74.             TIM_OCInitStructure.TIMER_OCPolarity        = TIMER_OC_POLARITY_LOW;         
  75.             TIMER_OC2_Init( TIMER2, &TIM_OCInitStructure );
  76.         }
  77.          {
  78.             ADC_InitPara ADC_InitStructure;
  79.             ADC_InitStructure.ADC_Mode_Scan         = ENABLE;
  80.             ADC_InitStructure.ADC_Mode_Continuous   = DISABLE;
  81.             ADC_InitStructure.ADC_Trig_External     = ADC_EXTERNAL_TRIGGER_MODE_T2_CC2;
  82.             ADC_InitStructure.ADC_Data_Align        = ADC_DATAALIGN_RIGHT;
  83.             ADC_InitStructure.ADC_Channel_Number    = 1;
  84.             ADC_Init(&ADC_InitStructure);
  85.             ADC_RegularChannel_Config( ADC_CHANNEL_10, 1, ADC_SAMPLETIME_55POINT5);
  86.             ADC_DMA_Enable(ENABLE);
  87.             ADC_ExternalTrigConv_Enable( ENABLE);
  88.             ADC_Enable(ENABLE);
  89.             ADC_Calibration();
  90.         }
  91.     }
  92.     while(1)
  93.     {
  94.         TIMER_Enable(TIMER2, ENABLE);
  95.         delay_ms(100);
  96.         printf("%3X\r\n", *AD_Value);
  97.                 OLED_ShowNum(18,3,*AD_Value,4,16);
  98.                 OLED_ShowNuma(18,6,*AD_Value*330/4096,4,16);
  99.                 while( !DMA_GetBitState( DMA1_FLAG_TC1 ));
  100.         DMA_ClearBitState( DMA1_FLAG_TC1 );
  101.         TIMER_Enable(TIMER2, DISABLE);
  102.     }
  103. }
复制代码
五、演示效果
在OLED屏上,同时以两种方式来显示采样值,一个以十进制数的方式,另一个是以电压值的方式,如图5所示。于此同时,通过虚拟串口在上位则可将接收的数据绘制成波形图,如图6所示。



1.png (21.25 KB, 下载次数: 69)

1.png

2.png (134.49 KB, 下载次数: 66)

2.png

3.png (155.34 KB, 下载次数: 58)

3.png

4.png (10.67 KB, 下载次数: 80)

4.png

5.png (120.76 KB, 下载次数: 52)

5.png

6.png (69.26 KB, 下载次数: 74)

6.png
分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-6-8 16:00:07 | 只看该作者

不错,期待后面更精彩的分享!
板凳

jinglixixi

发表于 2016-6-10 11:29:01 | 只看该作者

多谢了,后面会努力。
地板

stary666

发表于 2016-8-3 16:56:02 | 只看该作者

5#

0899

发表于 2016-8-7 22:14:08 | 只看该作者

提示: 作者被禁止或删除 内容自动屏蔽
6#

enenge

发表于 2016-8-7 23:05:48 | 只看该作者

学习一下            
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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