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

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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版