查看: 1043|回复: 5

[GD32F190方案分享] 基于GD32F190的模拟信号采集与显示装置设计

[复制链接]

54

主题

1

好友

1492

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 197 天

    [LV.7]常住居民III

    爱板会员勋章 活跃会员勋章

    发表于 2016-6-7 18:01:11 |显示全部楼层
    一、方案名称:  
    基于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
    2.png
    3.png
    4.png
    5.png
    6.png
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9626

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-8 16:00:07 |显示全部楼层
    不错,期待后面更精彩的分享!
    回复

    使用道具 举报

    54

    主题

    1

    好友

    1492

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 197 天

    [LV.7]常住居民III

    爱板会员勋章 活跃会员勋章

    发表于 2016-6-10 11:29:01 |显示全部楼层
    多谢了,后面会努力。
    回复

    使用道具 举报

    62

    主题

    1

    好友

    2963

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 497 天

    [LV.9]以坛为家II

    发表于 2016-8-3 16:56:02 |显示全部楼层
    回复

    使用道具 举报

    0

    主题

    1

    好友

    1077

    积分

    禁止发言

  • TA的每日心情
    难过
    2016-11-19 07:49
  • 签到天数: 133 天

    [LV.7]常住居民III

    发表于 2016-8-7 22:14:08 |显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    18

    主题

    3

    好友

    526

    积分

    举人

    Rank: 4

  • TA的每日心情
    慵懒
    2016-11-17 11:09
  • 签到天数: 45 天

    [LV.5]常住居民I

    发表于 2016-8-7 23:05:48 |显示全部楼层
    学习一下            
    回复

    使用道具 举报

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

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-5 18:29 , Processed in 0.128764 second(s), 16 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部