OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4418|回复: 4

多通道ADC的单个通道控制问题

[复制链接]

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-6-7
在线时间
2 小时
发表于 2015-6-28 10:40:20 | 显示全部楼层 |阅读模式
5金钱
      看了 ALIENTEK MINISTM32 实验16 内部温度传感器实验,改程序介绍了多通道ADC的用法,但是该实验中给ADC的
配置为单通道、单次转换模式,通道个数为1,也没有使用DMA。
     我想使用3个ADC通道,并使用DMA,将ADC配置为单通道、连续转换模式,通道个数为1,并为ADC转换数据开辟
一个长度为500的数组。在编译时程序没错,就是不能得到采样结果,我的程序如下,请帮忙看看,谢谢!
// ADC、DMA配置
 #include "adc.h"
 #include "delay.h"

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)
vu16 ADC_ConvertedValue[Sample_Num]; //Sample_Num 为500

static void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable ADC1 and GPIOC clock */
//RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_ADC1 | RCC_AHB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );  

/* Configure PA.01  as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure); 

/* Configure PC.00 PC.02  as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); 
}


static void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;

/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; 
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = Sample_Num ;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration */

  ADC_DeInit(ADC1);  

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 
ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);


RCC_ADCCLKConfig(RCC_PCLK2_Div6); 

// ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_55Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
// ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
// ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

// ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

// uint16_t ReadADCAverageValue(u8 ch, uint16_t Channel )
uint16_t ReadADCAverageValue( uint16_t Channel )
{
 uint16_t i;
 uint32_t sum = 0;
ADC_Cmd(ADC1, ENABLE);
ADC_DMACmd(ADC1, ENABLE);
switch (Channel)
{
case 0:

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
break;
}
case 1:

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
break;
}
case 2:

ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_55Cycles5);
break;
}
}
ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
 for(i=0; i<Sample_Num; i++)

sum+=ADC_ConvertedValue;
 
 ADC_Cmd(ADC1, DISABLE);
 ADC_DMACmd(ADC1, DISABLE);
 return (sum/Sample_Num);
}
  
void Adc_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}

//main函数
 int main(void)
 { 
u16 i; 
u16 adcx;
float temp;
delay_init();      
uart_init(9600); 
LED_Init();     
  LCD_Init();
  Adc_Init();     
POINT_COLOR=RED;
LCD_ShowString(40,50,200,16,16,"LD&TEC driver control system");
LCD_ShowString(40,70,200,16,16,"Status monitor");
LCD_ShowString(40,90,200,16,16,"Chinaoptoplex");
LCD_ShowString(40,110,200,16,16,"2015/6/6");

POINT_COLOR=BLUE;
LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");      
LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");
LCD_ShowString(60,170,200,16,16,"ADC_CH2_VAL:");      
LCD_ShowString(60,190,200,16,16,"ADC_CH2_VOL:0.000V");  
LCD_ShowString(60,210,200,16,16,"ADC_CH5_VAL:");      
LCD_ShowString(60,230,200,16,16,"ADC_CH5_VOL:0.000V");  
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
while(1)
{

for (i= 0; i < 3; i++)
{
adcx= ReadADCAverageValue(i);
LCD_ShowxNum(156,(130+i*40),adcx,4,16,0);
temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowxNum(156,(150+i*40),adcx,1,16,0);
}

temp-=adcx;
temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80);
LED0=!LED0;
LED1=!LED1;
delay_ms(250);
}    
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-28 10:48:29 | 显示全部楼层
这个你应该要用规则序列通道,多个通道来做。
单个通道不行的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-6-7
在线时间
2 小时
 楼主| 发表于 2015-6-28 11:07:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------

 你好,原子哥,你说的方法我已经实现了,但是这样做是三个通道依次转换,即数据存储格式是ch0/ch10/ch12 / ch0/ch10/ch12..........,
我是想一次只有一个通道转换,每个通道单独转换500次,然后让另个一通道单独转换500次。使用DMA传输数据。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-28 22:22:22 | 显示全部楼层
回复【3楼】hxing:
---------------------------------
那就用单个通道的DMA,每500次转换完了以后,换另外一个通道,接着转换。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-6-7
在线时间
2 小时
 楼主| 发表于 2015-6-29 22:22:24 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------

原子哥,你好,我上面贴出的 代码 就是这样做的,就是没有结果输出,你能不能帮我看看我代码,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 19:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表