野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13209|回复: 10

关于ADC采集串口发送到上位机遇到的问题

[复制链接]
发表于 2018-5-2 22:09:20 | 显示全部楼层 |阅读模式
我现[img]file:///C:\Users\Administrator\Documents\Tencent Files\1248297903\Image\Group\)3]TB`%M568LO[6[(7S9P_D.jpg[/img]在使用adc1采集一个电阻ad值,然后通过串口发送到调试助手上,但就是运行到while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));就走不动了。结果上位机显示的图片是这个

只显示初始化成功了

只显示初始化成功了

请问这是什么问题导致的啊。我都重新查看了端口配置,adc配置,都没有错啊。为什么就卡在这个循环里了呢。难道一直转换完成不了了。
以下是程序代码
  1. int main(void)
  2. {
  3.         u16        Adc1_Conv_Before;
  4.         float        Adc1_Conv_After;       
  5.        
  6.         Uart1_Init();

  7.         printf("Uart Init Is Success!\r\n");
  8.        
  9.         Adc1_Gpio_Init();
  10.         Adc1_Init();       

  11.         printf("Adc1 Init Is Success!\r\n");       
  12.                 while(1)
  13.         {       
  14.         Adc1_Conv_Before=Get_Adc();  
  15.         printf("A123\r\n");               
  16.                          Adc1_Conv_After=(float)Adc1_Conv_Before*4096*3.3;
  17.                         printf("The Adc1_Conv_Before is 0x%4x        \r\n",Adc1_Conv_Before);
  18.                         printf("The Adc1_Conv_After is %f        V\r\n",Adc1_Conv_After);
  19.         }
  20. }
复制代码
  1. void Adc1_Gpio_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;

  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1, ENABLE);  
  5.        
  6.                 RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  7.        
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                            
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  10.     GPIO_Init(GPIOC, &GPIO_InitStructure);        
  11. }

  12. void Adc1_Init()
  13. {
  14.         ADC_InitTypeDef ADC_InitStruct;
  15.        
  16.         ADC_DeInit(ADC1);
  17.        
  18.         ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
  19.         ADC_InitStruct.ADC_ScanConvMode=DISABLE;
  20.         ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;
  21.         ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigInjecConv_None;
  22.         ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
  23.         ADC_InitStruct.ADC_NbrOfChannel=1;

  24.         ADC_Init(ADC1, &ADC_InitStruct);

  25.         ADC_Cmd(ADC1, ENABLE);
  26.        
  27.         ADC_ResetCalibration(ADC1);

  28.         while(ADC_GetResetCalibrationStatus(ADC1));

  29.         ADC_StartCalibration(ADC1);

  30.         while(ADC_GetCalibrationStatus(ADC1));       
  31. }

  32. u16 Get_Adc()   
  33. {
  34. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  35.         ADC_RegularChannelConfig(ADC1,ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);       
  36.        
  37.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  38.        
  39.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

  40.         return ADC_GetConversionValue(ADC1);       
  41. }
复制代码
但是一旦我把while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));注释掉就可以了。但是明显程序还是有问题的,难道它一直转换完成不了吗?
回复

使用道具 举报

发表于 2018-5-3 10:07:10 | 显示全部楼层
应该是只触发了一次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 11:43:43 | 显示全部楼层
华欣悦 发表于 2018-5-3 10:07
应该是只触发了一次

不对啊,如果是只触发了一次的话,也应该在打开串口后出现GPIO初始化、UART初始化成功字符串后  打印出接下来的字符串啊,但是结果还是什么都没有,就直接卡在了while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));那里了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-4 21:47:17 | 显示全部楼层
mabaocong0371 发表于 2018-5-3 11:43
不对啊,如果是只触发了一次的话,也应该在打开串口后出现GPIO初始化、UART初始化成功字符串后  打印出接 ...

请问还有人知道吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-7 09:24:23 | 显示全部楼层
mabaocong0371 发表于 2018-5-4 21:47
请问还有人知道吗?

沉了沉了
回复 支持 反对

使用道具 举报

发表于 2018-5-7 11:20:07 | 显示全部楼层
你这不是开的自动连续转换吗?为什么要一直配置转换通道?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 11:39:22 | 显示全部楼层
非谢家之宝树 发表于 2018-5-7 11:20
你这不是开的自动连续转换吗?为什么要一直配置转换通道?

你说的是在配置过自动连续转换后(ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;),是不需要再配置规则通道(ADC_RegularChannelConfig(ADC1,ADC_Channel_14, 1, ADC_SampleTime_239Cycles5); )这个函数了吗?请指教。
回复 支持 反对

使用道具 举报

发表于 2018-5-13 08:53:44 | 显示全部楼层
mabaocong0371 发表于 2018-5-11 11:39
你说的是在配置过自动连续转换后(ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;),是不需要再配置规 ...

对啊,这个不修改配置一次就行了吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 09:39:31 | 显示全部楼层
非谢家之宝树 发表于 2018-5-13 08:53
对啊,这个不修改配置一次就行了吧?

我程序里确实是只配置了一次啊。
回复 支持 反对

使用道具 举报

发表于 2018-5-13 12:02:18 | 显示全部楼层
mabaocong0371 发表于 2018-5-13 09:39
我程序里确实是只配置了一次啊。

那你get_adc里面那句是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 22:56:17 | 显示全部楼层
非谢家之宝树 发表于 2018-5-13 12:02
那你get_adc里面那句是什么?

你好,我把ADC_RegularChannelConfig(ADC1,ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);    函数放到了adc_Init当中,变成了只调用了一次。代码如下
  1. void Adc1_Gpio_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;

  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1, ENABLE);  
  5.        
  6.                 RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  7.        
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                            
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //输入模式下不需要配置速度参数
  10.     GPIO_Init(GPIOC, &GPIO_InitStructure);        
  11. }
  12. /*
  13. *--------------------------------------------------------------------------------------------------------
  14. * Function:                  Adc1_Init
  15. * Description:              ADC成员初始化,开启ADC功能,复位校准基准电压
  16. * Input:                     none
  17. * Output:                    none
  18. * Return:                    none
  19. * Created by:        
  20. * Created date:      
  21. * Others:                                ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;        模式工作在独立模式
  22.                                                                                         ADC_InitStruct.ADC_ScanConvMode=DISABLE;                        不开启多通道扫描转换
  23.                                                                                         ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
  24.                                                                                         ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigInjecConv_None;        不适用外部中断触发转换
  25.                                                                                         ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;        数据采用右对齐模式
  26.                                                                                         ADC_InitStruct.ADC_NbrOfChannel=1;        转换频道数为1个通道
  27. *---------------------------------------------------------------------------------------------------------
  28. */
  29. void Adc1_Init()
  30. {
  31.         ADC_InitTypeDef ADC_InitStruct;
  32.        
  33.         ADC_DeInit(ADC1);
  34.        
  35.         ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
  36.         ADC_InitStruct.ADC_ScanConvMode=DISABLE;
  37.         ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;
  38.         ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigInjecConv_None;
  39.         ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
  40.         ADC_InitStruct.ADC_NbrOfChannel=1;

  41.         ADC_Init(ADC1, &ADC_InitStruct);
  42.        
  43.         ADC_RegularChannelConfig(ADC1,ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);       

  44.         ADC_Cmd(ADC1, ENABLE);        //必须先进行ADC的使能以后才可以进行复位校准和开始校准
  45.        
  46.         ADC_ResetCalibration(ADC1);

  47.         while(ADC_GetResetCalibrationStatus(ADC1));//复位成功显示返回0                ADC_GetResetCalibrationStatus(ADC1)!=1

  48.         ADC_StartCalibration(ADC1);

  49.         while(ADC_GetCalibrationStatus(ADC1));       
  50. }
  51. /*
  52. *--------------------------------------------------------------------------------------------------------
  53. * Function:                  Get_Adc
  54. * Description:              进行ADC的转换,选对频道,等待状态标志位置一,返回16位的ADC数据。
  55. * Input:                     none
  56. * Output:                    none
  57. * Return:                    none
  58. * Created by:        
  59. * Created date:      
  60. * Others:               
  61. *---------------------------------------------------------------------------------------------------------
  62. */
  63. u16 Get_Adc()   
  64. {
  65.        
  66.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  67.        
  68.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

  69.         return ADC_GetConversionValue(ADC1);       
  70. }
复制代码
最后现象还是不可以啊 还是同最初的现象一样 只打印出2个初始化完成
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 03:52 , Processed in 0.039759 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表