你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的ADC编程方法

[复制链接]
STMCU小助手 发布时间:2022-1-23 15:42
记录一下STM32的ADC编程方法!
        前面已经学习了DMA,知道如何使用DMA去减小CPU的负担,这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。

---第一步是---了解STM32的ADC对应的GPIO口----如下图---不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节----!

20141103230734890.jpg

---第二步是---配置相应ADC转换的GPIO口----这里使用PC0--PC1
  1. static void ADC1_GPIO_Config(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;

  4. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //打开DMA1的时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入
  8. GPIO_Init(GPIOC, &GPIO_InitStructure);
  9. }
复制代码

---第三步是---配置ADC的DMA----配置ADC通道等---
  1. <div align="left">#define ADC1_DR_Address    ((u32)0x40012400+0x4c)  //外设地址
  2. __IO uint16_t ADC_ConvertedValue[2];  //内存数组</div>
  3. <div align="left">static void ADC1_Mode_Config(void)
  4. {
  5. DMA_InitTypeDef DMA_InitStructure;
  6. ADC_InitTypeDef ADC_InitStructure;

  7. DMA_DeInit(DMA1_Channel1);  
  8. //---------------ADC的DMA配置--------------------
  9. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC1地址---代表ADC1保存转换值的寄存器
  10. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;  //内存地址---用来保存DMA传输过来的ADC转换值----后面直接使用的变量地址
  11. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //外设为数据源
  12. DMA_InitStructure.DMA_BufferSize = 2;  //传输总数据---2通道需要传输2个数据
  13. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址固定
  14. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址自增---总体表示始终从外设ADC1地址处取值---依次保存到连续的两个内存变量中---
  15. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   //外设传输数据单元---半字16位
  16. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //内存传输数据单元---半字16位
  17. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //循环模式---2个数据依次循环接收从外设ADC1传输过来的ADC值---
  18. DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //高优先级
  19. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //禁止内存传内存
  20. DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  21. DMA_Cmd(DMA1_Channel1, ENABLE);  //再次打开DMA1

  22.         //------------ADC模式配置------------------------
  23. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //独立模式----还有很多模式---这个比较常见
  24. ADC_InitStructure.ADC_ScanConvMode = ENABLE ;   //扫描模式---采集多通道使用----本程序采集2通道---所以扫描模式
  25. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换模式---不难理解---就是不停地采集---一次接一次
  26. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //不使用外部触发转换---触发分为外部触发---比如中断与定时器。软件触发---后面有专用函数
  27. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //采集的数据右对齐---方便计算
  28. ADC_InitStructure.ADC_NbrOfChannel = 2;  //总共需要转换的通道个数---这里2个
  29. ADC_Init(ADC1, &ADC_InitStructure);

  30. RCC_ADCCLKConfig(RCC_PCLK2_Div8);  //配置ADC转换时钟---PCLK2的8分频
  31.         //下面这个函数比较重要----配置ADC的通道与采样周期---前面说的PC0与PC1对应的ADC通道分别是--10与11。采集周期也有几种。
  32. ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
  33. ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);

  34. ADC_DMACmd(ADC1, ENABLE);  //打开DMA1的ADC1
  35. ADC_Cmd(ADC1, ENABLE);  //打开ADC1

  36. ADC_ResetCalibration(ADC1);  //复位校准寄存器
  37. while(ADC_GetResetCalibrationStatus(ADC1));  //等待校准寄存器复位完成

  38. ADC_StartCalibration(ADC1);  //ADC校准
  39. while(ADC_GetCalibrationStatus(ADC1));  //校准完成

  40. ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //软件触发转换
  41. }</div>
复制代码

---第四部分是---在硬件上使用了一个通道切换芯片----CD4052----由PC2---PC3控制通道的选择CD4052切换控制GPIO配置----
  1. void GPIO_Config(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;

  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推完输出
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8. GPIO_Init(GPIOC, &GPIO_InitStructure);
  9. }
复制代码

---第五部分是---主函数-----
  1. <div align="left">extern __IO uint16_t ADC_ConvertedValue[2];  //声明外部变量
  2. uint16_t My_ADC[2];  //求平均值</div><div align="left">int main(void)
  3. {
  4. u8 i,led=0x01;

  5. USART1_Config();</div><div align="left">
  6. ADC1_GPIO_Config();
  7. ADC1_Mode_Config();</div><div align="left">
  8. while (1)
  9. {
  10. My_ADC[0]=0;
  11. My_ADC[1]=0;


  12. for(i=0;i<10;i++)  
  13. {
  14.                         My_ADC[0]+=ADC_ConvertedValue[0];
  15. My_ADC[1]+=ADC_ConvertedValue[1];
  16.                }
  17. My_ADC[0]=My_ADC[0]/10;   //采集10次求平均值
  18. My_ADC[1]=My_ADC[1]/10;

  19. ADC_ConvertedValueLocal =(float) My_ADC[0]/4096*3.3;   //转换为电压值

  20. printf("\r\n The current AD---0 value = 0x%04X \n", My_ADC[0]);
  21. printf("The current AD---0 value = %f V \n",ADC_ConvertedValueLocal);

  22. ADC_ConvertedValueLocal =(float) My_ADC[1]/4096*3.3;

  23. printf("The current AD---1 value = 0x%04X \n", My_ADC[1]);
  24. printf("The current AD---1 value = %f V \n",ADC_ConvertedValueLocal);  
  25. }
  26. }</div>
复制代码

收藏 评论0 发布时间:2022-1-23 15:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版