一、方案名称:
基于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所示。
系统流程图
程序设计 主函数的程序代码如下:- int main(void)
- {
- RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA |
- RCC_AHBPERIPH_GPIOB |
- RCC_AHBPERIPH_GPIOC |
- RCC_AHBPERIPH_GPIOF, ENABLE );
- delay_init(72);
- /* USART initialize */
- {
- USART_InitPara USART_InitStructure;
- USART_DeInit( EVAL_COM1 );
- USART_InitStructure.USART_BRR = 115200;
- USART_InitStructure.USART_WL = USART_WL_8B;
- USART_InitStructure.USART_STBits = USART_STBITS_1;
- USART_InitStructure.USART_Parity = USART_PARITY_RESET;
- USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
- USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;
- GD_EVAL_COMInit(&USART_InitStructure);
- }
- OLED_Init();
- OLED_Clear();
- OLED_ShowCHinesea(18,0,0);
- OLED_ShowCHinesea(36,0,1);
- OLED_ShowCHinesea(54,0,2);
- OLED_ShowCHinesea(72,0,3);
- OLED_ShowCHinesea(90,0,4);
- OLED_ShowString(18,6,"3.30 V",16);
- {
- {
- RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6);
- RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_DMA1 , ENABLE);
- RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_ADC1, ENABLE);
- RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2, ENABLE);
- }
- {
- GPIO_InitPara GPIO_InitStructure;
- /* Configure PC0 (ADC Channel 10) as analog input */
- GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AN;
- GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- {
- DMA_InitPara DMA_InitStructure;
- DMA_DeInit( DMA1_CHANNEL1 );
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->RDTR ;
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
- DMA_InitStructure.DMA_BufferSize = 220;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
- DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_HALFWORD;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_HALFWORD;
- DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
- DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
- DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
- DMA_Init( DMA1_CHANNEL1 , &DMA_InitStructure);
- DMA_Enable( DMA1_CHANNEL1 , ENABLE);
- }
- {
- TIMER_BaseInitPara TIM_TimeBaseStructure;
- TIMER_OCInitPara TIM_OCInitStructure;
- TIMER_BaseStructInit( &TIM_TimeBaseStructure );
- TIM_TimeBaseStructure.TIMER_Period = 200;
- TIM_TimeBaseStructure.TIMER_Prescaler = 5;
- TIM_TimeBaseStructure.TIMER_ClockDivision = 0x0;
- TIM_TimeBaseStructure.TIMER_CounterMode = TIMER_COUNTER_UP;
- TIMER_BaseInit( TIMER2, &TIM_TimeBaseStructure );
- TIM_OCInitStructure.TIMER_OCMode = TIMER_OC_MODE_PWM1;
- TIM_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
- TIM_OCInitStructure.TIMER_Pulse = 100;
- TIM_OCInitStructure.TIMER_OCPolarity = TIMER_OC_POLARITY_LOW;
- TIMER_OC2_Init( TIMER2, &TIM_OCInitStructure );
- }
- {
- ADC_InitPara ADC_InitStructure;
- ADC_InitStructure.ADC_Mode_Scan = ENABLE;
- ADC_InitStructure.ADC_Mode_Continuous = DISABLE;
- ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_T2_CC2;
- ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
- ADC_InitStructure.ADC_Channel_Number = 1;
- ADC_Init(&ADC_InitStructure);
- ADC_RegularChannel_Config( ADC_CHANNEL_10, 1, ADC_SAMPLETIME_55POINT5);
- ADC_DMA_Enable(ENABLE);
- ADC_ExternalTrigConv_Enable( ENABLE);
- ADC_Enable(ENABLE);
- ADC_Calibration();
- }
- }
- while(1)
- {
- TIMER_Enable(TIMER2, ENABLE);
- delay_ms(100);
- printf("%3X\r\n", *AD_Value);
- OLED_ShowNum(18,3,*AD_Value,4,16);
- OLED_ShowNuma(18,6,*AD_Value*330/4096,4,16);
- while( !DMA_GetBitState( DMA1_FLAG_TC1 ));
- DMA_ClearBitState( DMA1_FLAG_TC1 );
- TIMER_Enable(TIMER2, DISABLE);
- }
- }
复制代码五、演示效果 在OLED屏上,同时以两种方式来显示采样值,一个以十进制数的方式,另一个是以电压值的方式,如图5所示。于此同时,通过虚拟串口在上位则可将接收的数据绘制成波形图,如图6所示。
|