[其他ST产品] stm32 ADC理解

[复制链接]
1045|37
 楼主| 工程师犹饿死 发表于 2022-6-28 17:35 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2022-6-28 17:38 | 显示全部楼层
3、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息;

       大家通过打开"stm32f10.adc.h"可以看到:
 楼主| 工程师犹饿死 发表于 2022-6-28 17:45 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2022-6-28 17:47 | 显示全部楼层
4、使能ADC并校准

注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准)

还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢?

这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码

      分别的库函数请看待会的代码。(请用比较老外的方式去看,也就是用英语啦,为什么呢?请看下文)
 楼主| 工程师犹饿死 发表于 2022-6-28 17:48 | 显示全部楼层
  5、读取AD的值

    当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、
 楼主| 工程师犹饿死 发表于 2022-6-28 17:49 | 显示全部楼层
相关的库函数请看代码、
  1. void Adc_Init(void)
  2. {

  3.     ADC_InitTypeDef ADC_InitStructure;
  4.     GPIO_InitTypeDef GPIO_InitStructure;

  5.    /* Enable ADC1 and GPIOA clock */
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

  7.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ
  8.    
  9.   /* Configure PA.1 (ADC Channel) as analog input -------------------------*/
  10.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  12.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  13.    
  14.     //ADC_DeInit(ADC1);//在这里复位被我注释掉了、至于为什么,我待会会说
  15.    
  16.       /* ADC1 configuration ------------------------------------------------------*/
  17.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//这里对应上面所讲的配置,在这里就不给出注释了
  18.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  19.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  20.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  21.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  22.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  23.   ADC_Init(ADC1, &ADC_InitStructure);
  24.    
  25.     /* Enable ADC1 *///知道我为啥要在上面提醒大家要用老外的方式来看了吧、因为这里的注释都是用英文的
  26.   //请不要以为我装逼,我这样做是有原因的、、原因我待会会说、你也会明白我最初的标题为何那样写

  27.   ADC_Cmd(ADC1, ENABLE);

  28.   /* Enable ADC1 reset calibration register */   
  29.   ADC_ResetCalibration(ADC1);
  30.   /* Check the end of ADC1 reset calibration register */
  31.   while(ADC_GetResetCalibrationStatus(ADC1));

  32.   /* Start ADC1 calibration */
  33.   ADC_StartCalibration(ADC1);
  34.   /* Check the end of ADC1 calibration */
  35.   while(ADC_GetCalibrationStatus(ADC1));
  36. }
 楼主| 工程师犹饿死 发表于 2022-6-28 17:50 | 显示全部楼层
  1. u16 Get_val(u8 ch)
  2. {
  3.     u16 DataValue; //又是英文注释、、啊哈   
  4. /* ADC1 regular channel14 configuration */
  5.   ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
  6.    
  7.     /* Start ADC1 Software Conversion */
  8.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  9.    
  10.     /* Test if the ADC1 EOC flag is set or not */
  11.    
  12.     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

  13.     //FlagStatus Status;
  14.     //Status = ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
  15.     //while(!Status);---->这样做实现不了、请注意

  16. /*Returns the ADC1 Master data value of the last converted channel*/
  17. DataValue = ADC_GetConversionValue(ADC1);
  18. return DataValue;
  19. }

  20. u16 ADC_Get_aveg(u8 ch,u8 n)
  21. {
  22. u32 ad_sum = 0;
  23. u8 i;
  24. for(i=0;i<n;i++)
  25. {
  26. ad_sum += Get_val(ch);
  27. delay_ms(5);
  28. }
  29. return (ad_sum / n);
  30. }

  31. adcx=ADC_Get_aveg(ADC_Channel_1,10);//获取AD数值(0~4095)

  32. temp=(float)adcx*(3.3/4096);//获取相应的电压值
 楼主| 工程师犹饿死 发表于 2022-6-28 17:59 | 显示全部楼层
  到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为什么有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴、
 楼主| 工程师犹饿死 发表于 2022-6-28 18:01 | 显示全部楼层
步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例:
 楼主| 工程师犹饿死 发表于 2022-6-28 18:08 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2022-6-28 18:22 | 显示全部楼层
点击main.c可以看到神奇的一幕:
 楼主| 工程师犹饿死 发表于 2022-6-28 22:18 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2022-6-28 22:22 | 显示全部楼层
大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看:
 楼主| 工程师犹饿死 发表于 2022-6-28 22:23 | 显示全部楼层
对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、
 楼主| 工程师犹饿死 发表于 2022-6-28 22:28 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2022-6-28 22:31 | 显示全部楼层
所以大家要好好利用官方给的历程、说到这、你猜我词穷了吗?

  答案是否定的、、我还有话要说:

  做一件事要有一个目的、、才不会显得自己做的很空泛、、我写博客也一样、、我想让我自己理清思路、也希望自己在写的过程中能领悟到自己在学的时候没领悟到的知识点、、也希望能帮到跟我有一样困惑的人、、我把我不懂的理解后写下来、我也知道会有人跟我一样遇到同样不懂的地方、、所以这就是我的目的哈、、希望能帮到你们、、尽管不认识你们、、啊哈、、初学者、难免有出错、、所以、写错或理解错的请帮我指出来、臣不甚感激,今当远离,零表涕零,不知所言、、
 楼主| 工程师犹饿死 发表于 2022-6-28 22:31 | 显示全部楼层
附上ADC通道
1881062bb10d6090ee.png
dongnanxibei 发表于 2022-7-4 17:50 | 显示全部楼层
转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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