[MM32软件] 【灵动微电子MM32F5330测评】串口打印ADC参数

[复制链接]
2556|2
 楼主| xiaoqi976633690 发表于 2024-6-22 14:58 | 显示全部楼层 |阅读模式
本帖最后由 xiaoqi976633690 于 2024-6-22 14:58 编辑

一、实验目的
通过ADC1获取板上3个电位器的实时电压参数并打印串口显示
原理图如下
ADC.png
对应关系
ADC_Channel_1:PA1(RV1)
ADC_Channel_4:PA4(RV2)
ADC_Channel_5:PA5(RV3)

二、实验代码
1.初始化ADC函数实现
  1. void ADC_Configure(void)
  2. {
  3.     ADC_InitTypeDef  ADC_InitStruct;
  4.     GPIO_InitTypeDef GPIO_InitStruct;

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  6.    
  7.     ADC_CalibrationConfig(ADC1, 0x1FE);
  8.    
  9.     ADC_StructInit(&ADC_InitStruct);
  10.     ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  11.     ADC_InitStruct.ADC_Prescaler  = ADC_Prescaler_16;
  12.     ADC_InitStruct.ADC_Mode       = ADC_Mode_Scan;
  13.     ADC_InitStruct.ADC_DataAlign  = ADC_DataAlign_Right;
  14.     ADC_Init(ADC1, &ADC_InitStruct);

  15.     ADC_SampleTimeConfig(ADC1, ADC_Channel_1, ADC_SampleTime_240_5);
  16.     ADC_SampleTimeConfig(ADC1, ADC_Channel_4, ADC_SampleTime_240_5);
  17.     ADC_SampleTimeConfig(ADC1, ADC_Channel_5, ADC_SampleTime_240_5);

  18.     ADC_ChannelCmd(ADC1, ADC_Channel_1, ENABLE);
  19.     ADC_ChannelCmd(ADC1, ADC_Channel_4, ENABLE);
  20.     ADC_ChannelCmd(ADC1, ADC_Channel_5, ENABLE);

  21.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  22.     /* PA1(RV1) PA4(RV2) PA5(RV3) */
  23.     GPIO_StructInit(&GPIO_InitStruct);
  24.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  25.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  26.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AIN;
  27.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  28.     ADC_Cmd(ADC1, ENABLE);
  29. }
初始化步骤:
a.定义ADC结构体和GPIO结构体。
b.开启ADC时钟。c.通过ADC_CalibrationConfig(ADC1, 0x1FE); 函数校准adc。
d.初始化adc的功能模式 12bit分辨率、分频系数16、单周期扫描模式、数据右对齐模式。
e.采样时间配置
f.使能channel
g.开启GPIO时钟,初始化GPIO模式为模拟输入。

2.ADC channel 数值获取函数实现
初始化完成后就可以编写adc值获取函数了
  1. uint16_t Get_ADC( uint8_t channel)
  2. {
  3.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  4.         while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_EOS)){ }
  5.         ADC_ClearFlag(ADC1, ADC_FLAG_EOS);
  6.         return ADC_GetChannelConvertedValue(ADC1, channel) ;
  7. }
首先开启转换,等待转换完成后,清除标志位,再返回通道数据。

3.串口初始化
串口初始化比较简单
主要关注板子串口1是通过PA9,PA10 和板载ch340连接的,注意GPIO复用
  1. void PLATFORM_InitConsole(uint32_t Baudrate)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     UART_InitTypeDef UART_InitStruct;

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);

  6.     UART_StructInit(&UART_InitStruct);
  7.     UART_InitStruct.BaudRate      = Baudrate;
  8.     UART_InitStruct.WordLength    = UART_WordLength_8b;
  9.     UART_InitStruct.StopBits      = UART_StopBits_1;
  10.     UART_InitStruct.Parity        = UART_Parity_No;
  11.     UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
  12.     UART_InitStruct.Mode          = UART_Mode_Tx|UART_Mode_Rx;
  13.     UART_Init(UART1, &UART_InitStruct);

  14.     UART_Cmd(UART1, ENABLE);

  15.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  16.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);
  17.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
  18.     GPIO_StructInit(&GPIO_InitStruct);
  19.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;
  20.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  21.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  22.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  23. }



4.main函数实现
  1. int main(void)
  2. {
  3.                 float voltage=0.0;
  4.     PLATFORM_Init();
  5.                 ADC_Configure();
  6.     while (1)
  7.     {
  8.                         PLATFORM_DelayMS(500);
  9.                         voltage=Get_ADC(ADC_Channel_1)*3.3/4096;
  10.                         printf("CH1=%0.2f  ",voltage);
  11.                         voltage=Get_ADC(ADC_Channel_4)*3.3/4096;
  12.                         printf("CH4=%0.2f  ",voltage);
  13.                         voltage=Get_ADC(ADC_Channel_5)*3.3/4096;
  14.                         printf("CH4=%0.2f\n\r",voltage);

  15.     }
  16.                
  17.                
  18. }




三、实验结果
依次扭转3个电位器电压实时变化状态
  1. CH1=0.00  CH4=0.00  CH4=0.00
  2. CH1=0.00  CH4=0.00  CH4=0.00
  3. CH1=0.00  CH4=0.00  CH4=0.00
  4. CH1=0.00  CH4=0.00  CH4=0.00
  5. CH1=0.00  CH4=0.00  CH4=0.00
  6. CH1=0.00  CH4=0.00  CH4=0.00
  7. CH1=0.00  CH4=0.00  CH4=0.00
  8. CH1=1.16  CH4=0.00  CH4=0.00
  9. CH1=1.21  CH4=0.00  CH4=0.00
  10. CH1=1.99  CH4=0.00  CH4=0.00
  11. CH1=2.23  CH4=0.00  CH4=0.00
  12. CH1=2.32  CH4=0.00  CH4=0.00
  13. CH1=2.32  CH4=0.00  CH4=0.00
  14. CH1=2.32  CH4=0.00  CH4=0.00
  15. CH1=2.32  CH4=0.00  CH4=0.00
  16. CH1=2.32  CH4=0.00  CH4=0.00
  17. CH1=2.32  CH4=0.00  CH4=0.00
  18. CH1=2.32  CH4=0.00  CH4=0.00
  19. CH1=2.32  CH4=0.00  CH4=0.00
  20. CH1=2.32  CH4=0.17  CH4=0.00
  21. CH1=2.32  CH4=0.62  CH4=0.00
  22. CH1=2.32  CH4=0.61  CH4=0.00
  23. CH1=2.32  CH4=0.61  CH4=0.00
  24. CH1=2.32  CH4=0.61  CH4=0.00
  25. CH1=2.32  CH4=0.61  CH4=0.35
  26. CH1=2.32  CH4=0.61  CH4=0.84
  27. CH1=2.32  CH4=0.61  CH4=0.84
  28. CH1=2.32  CH4=0.61  CH4=0.84
  29. CH1=2.32  CH4=0.61  CH4=0.84
  30. CH1=2.32  CH4=0.61  CH4=0.84
  31. CH1=2.32  CH4=0.61  CH4=0.84





Bowclad 发表于 2024-6-27 18:17 | 显示全部楼层
看着配置还是挺简单的
地瓜patch 发表于 2024-6-28 17:32 来自手机 | 显示全部楼层
目测是12位adc,为啥没有做16位adc的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

205

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部