于鱼同游 发表于 2016-9-20 17:29:30

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

本帖最后由 于鱼同游 于 2016-9-20 17:31 编辑


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

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

u16 start_adc1_4()
{
      ADC1->CR2 |=1<<22;//启动ad转换
      while((ADC1->SR &1<<2)==0)
      {
                ;//等待转换结束
      }
//      ADC1->SR &=~(1<<2);
      return ADC1->JDR1 ;//第一次转换组结果(电位器电压)
}
u16 start_adc1_5()
{
      ADC1->CR2 |=1<<22;//启动ad转换
      while((ADC1->SR &1<<2)==0)
      {
                ;//等待转换结束
      }
//      ADC1->SR &=~(1<<2);
      return ADC1->JDR2 ;//第二次转换组结果(光敏电阻光强)
}上面的是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;
      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.求解决,急!!!!!!
第一次在论坛问问题,很多不懂,不知道有没有大神会帮忙啊!

haohao663 发表于 2016-9-21 08:57:18

给你个多通道AD转换例程参考
【HAL库每天一例】第023例:ADC-多通道采集(DMA)
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=606231&fromuid=331315
(出处: 意法半导体STM32/STM8技术社区)

cldym 发表于 2017-3-12 11:21:47

学习学习

chen00000009 发表于 2017-3-12 11:27:54

你那个AD的寄存器是不是要清一下啊

wenyangzeng 发表于 2017-3-12 15:23:16

你才转换2个通道,何必使用注入方式,你用连续多通道转换即可,ST官方有例程修改一下就可以了。

努力的人 发表于 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
页: [1]
查看完整版本: stm32ad转换单次转换模式注入组2个转换,同时采集光强和电压