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

stm32ad转换单次转换模式注入组2个转换,同时采集光强和电压

[复制链接]
于鱼同游 提问时间:2016-9-20 17:29 /
本帖最后由 于鱼同游 于 2016-9-20 17:31 编辑

程序结果

程序结果

  1. #include "stm32f4xx.h"
  2. //#include "adc.h"

  3. /*ADC1 IN4 引脚PA4,测量光照强度,ADC1 IN5 引脚PA5,测量电位器电压*/
  4. void adc1_init_in4()
  5. {
  6.         RCC->AHB1ENR |=1;//pa引脚时钟使能
  7.         RCC->APB2ENR |=1<<8;//adc1时钟使能
  8.         GPIOA->MODER |=3<<8;//PA4模拟模式输出
  9.         GPIOA->MODER |=3<<10;//PA5模拟模式输出
  10.         
  11.         ADC->CCR |=3<<16;//8分频ADCLK=PCLK2/8
  12.         
  13.         ADC1->CR1 &=~(3<<24);//ADC分辨率12位
  14.         ADC1->CR2 &=~(3<<20);//禁止注入组外部触发,软件方式启动注入组转换
  15.         
  16.         ADC1->SMPR2 |=7<<12;//IN4采样时间480个周期
  17.         ADC1->SMPR2 |=7<<15;//IN5采样时间480个周期
  18.         
  19.         ADC1->JSQR&=~(3<<20);
  20.         ADC1->JSQR |=1<<20;//注入组2个转换
  21.         
  22.         ADC1->JSQR &=~(0X1F<<10);
  23.         ADC1->JSQR |=5<<10;//注入组第一次转换为IN5
  24.         
  25.         ADC1->JSQR &=~(0X1F<<15);
  26.         ADC1->JSQR |=4<<15;//注入组第2次转换为通道4
  27.         
  28.         ADC1->CR2 |=1;//使能ADC
  29. }

  30. u16 start_adc1_4()
  31. {
  32.         ADC1->CR2 |=1<<22;//启动ad转换
  33.         while((ADC1->SR &1<<2)==0)
  34.         {
  35.                 ;//等待转换结束
  36.         }
  37. //        ADC1->SR &=~(1<<2);
  38.         return ADC1->JDR1 ;//第一次转换组结果(电位器电压)
  39. }
  40. u16 start_adc1_5()
  41. {
  42.         ADC1->CR2 |=1<<22;//启动ad转换
  43.         while((ADC1->SR &1<<2)==0)
  44.         {
  45.                 ;//等待转换结束
  46.         }
  47. //        ADC1->SR &=~(1<<2);
  48.         return ADC1->JDR2 ;//第二次转换组结果(光敏电阻光强)
  49. }
复制代码
上面的是adc文件代码,主函数文件代码如下
#include "stm32f4xx.h"
#include "key.h"
#include "LED.h"
#include "UART.h"
#include "delay.h"
#include "lcd_gui.h"
#include "rtc.h"
#include <stdio.h>
#include "set.h"
#include "lcd.h"
#include "adc.h"





//时钟源 25M
int main()
{
        u8 buf[40];
        u16 temp1,temp2;
        
        init_lcd();//触摸屏初始化
        init_uart1();//串口初始化
        adc1_init_in4();//AD转换初始化
        lcd_dis_string(68, 100, RED, (u8 *)"dwq:");
        lcd_dis_string(68, 116, RED, (u8 *)"gzq:");//触摸屏显示字符串
        while(1)
        {
                /*显示光强*/
                temp2=start_adc1_5();//开始转换通道5(采集光强)
                sprintf((char *)buf,"%4d",temp2);//转换的数据存到数组中
                lcd_dis_string(100, 116, RED, (u8 *)buf);//触摸屏显示数据
                printf("gzq:%.3f\r\n",temp2*(3.3/4096));//串口发数据(用来检查电压是否在0~3.3v)
                delay_ms(250);
                        /*显示电位器电压*/
                temp1=start_adc1_4();
                sprintf((char *)buf,"%4d",temp1);//开始转换通道4电位器电压采集
                lcd_dis_string(100, 100, RED, (u8 *)buf);
                printf("dwq:%.3f\r\n",temp1*(3.3/4096));
                delay_ms(250);
        }
}


第一次转换的结果没问题,但第二次转换结果数据总是0.比如第一次转换电压时,第二次光强转换数据为0,第一次转换光强时,第二次转换电压数据为0.求解决,急!!!!!!
第一次在论坛问问题,很多不懂,不知道有没有大神会帮忙啊!

收藏 2 评论7 发布时间:2016-9-20 17:29

举报

7个回答
haohao663 回答时间:2016-9-21 08:57:18
给你个多通道AD转换例程参考
【HAL库每天一例】第023例:ADC-多通道采集(DMA)
https://www.stmcu.org.cn/module/ ... &fromuid=331315
(出处: 意法半导体STM32/STM8技术社区)
cldym 回答时间:2017-3-12 11:21:47
学习学习
chen000000009 回答时间:2017-3-12 11:27:54
你那个AD的寄存器是不是要清一下啊
wenyangzeng 回答时间:2017-3-12 15:23:16
你才转换2个通道,何必使用注入方式,你用连续多通道转换即可,ST官方有例程修改一下就可以了。

DualADC_RegulSimu_DMAmode1.rar

下载

18.76 KB, 下载次数: 13, 下载积分: ST金币 -1

努力的人 回答时间:2017-3-12 16:18:22
你先测一下传感器是否有输出
无薪税绵 回答时间:2017-3-12 21:31:58
切换通道后,建议增加延时。
于鱼同游 回答时间:2017-8-23 17:10:47
haohao663 发表于 2016-9-21 08:57
给你个多通道AD转换例程参考
【HAL库每天一例】第023例:ADC-多通道采集(DMA)
https://www.stmcu.org.cn/module ...

thanks

所属标签

相似问题

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