打印
[STM32F4]

ADC读出来怎么都是0,求大神指导啊

[复制链接]
5129|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
windit|  楼主 | 2014-6-12 11:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ADC, DM, DMA, ni, ST
ADC1
void ADC_channel_init(void)
{
    /*
    通道0   PA0
    通道1   PA1
    通道2   PA2
    通道3   PA3
    通道4   PA4
    通道5   PA5
    通道6   PA6
    通道7   PA7
    通道8   PB0
    通道9   PB1
    通道10   PC0
    通道11   PC1
    通道12   PC2
    通道13   PC3
    通道14   PC4
    通道15   PC5
    */
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);
    //PA0/1/2/3 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //PC0/1/2/3/4/5 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}


void ADC1_Configuration(void)
{
    ADC_InitTypeDef        ADC_InitStructure;
    ADC_CommonInitTypeDef  ADC_CommonInitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   
    /* ADC Common Init **********************************************************/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;//2分频
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);
    /* ADC3 Init ****************************************************************/
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;//模数转换工作在扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//模数转换工作在连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//外部触发转换关闭
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;       
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfConversion = M;
    ADC_Init(ADC3, &ADC_InitStructure);
    //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
    //ADC1,ADC通道x,规则采样顺序值为y,采样时间为3周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_3Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 5, ADC_SampleTime_3Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 8, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 9, ADC_SampleTime_3Cycles );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 10, ADC_SampleTime_3Cycles );

    /* Enable DMA request after last transfer (Single-ADC mode) */
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
    ADC_DMACmd(ADC1, ENABLE);  
    ADC_Cmd(ADC1, ENABLE);  
}


void DMA_Configuration(void)
{  
    /* DMA1 Stream0 channel2 configuration **************************************/
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);//使能时钟
    DMA_InitStructure.DMA_Channel = DMA_Channel_1;  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; //DMA外设ADC基地址
//    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&AD_Value;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = N*M;//DMA通道的DMA缓存的大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度为16位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据宽度为16位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//工作在循环缓存模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA1_Stream0, &DMA_InitStructure);
    DMA_Cmd(DMA1_Stream0, ENABLE);
}

uint16_t GetVolt(uint16_t advalue)

{

    return (uint16_t)(advalue * 330 / 4096); //求的结果扩大了100倍,方便下面求出小数

}


void filter(void)
{
    int sum = 0;
    uint8_t count;
    for(int i=0;i<10;i++)

    {

        for ( count=0;count<N;count++)

        {

            sum += AD_Value[i][count];

        }

        After_filter[i]=sum/N;
        sum=0;
    }

}

main:

uint16_t AD_Value[M][N]; //用来存放ADC转换结果,也是DMA的目标地址
uint16_t After_filter[M]; //用来存放求平均值之后的结果

int main(void)
{
   
    bsp_InitUart();
    delay_init(180);
    ADC_channel_init();
    ADC1_Configuration();
    DMA_Configuration();
    uint16_t value[M];
    while(1)
    {
         filter();
         for(int i=0;i<M;i++)
        {
            value[i]= GetVolt(After_filter[i]);
            printf("value[%d]:%dV  %dV\r\n",i,value[i]/100,value[i]);
            delay_ms(100);
        }
    }
}

打印出来的值都为0,求大神指导,是不是哪里设置错了?
沙发
mmuuss586| | 2014-6-12 12:20 | 只看该作者

改成ADC1

使用特权

评论回复
板凳
windit|  楼主 | 2014-6-12 13:21 | 只看该作者
mmuuss586 发表于 2014-6-12 12:20
改成ADC1

这些都改掉了,是不是没使能TIM1中断,启动AD转换?

使用特权

评论回复
地板
mmuuss586| | 2014-6-12 13:28 | 只看该作者
windit 发表于 2014-6-12 13:21
这些都改掉了,是不是没使能TIM1中断,启动AD转换?

不用;

使用特权

评论回复
5
mmuuss586| | 2014-6-12 13:30 | 只看该作者
你根据官方例程修改吧;

再看看我发的;
https://bbs.21ic.com/icview-745790-1-1.html
STM32F4(F2)ADC3 DMA例程改成ADC1或ADC2三部曲 [

使用特权

评论回复
6
windit|  楼主 | 2014-6-12 13:39 | 只看该作者
mmuuss586 发表于 2014-6-12 13:30
你根据官方例程修改吧;

再看看我发的;

谢谢,版主!我看过这帖子,也按照这改了,还是不行呢!

使用特权

评论回复
7
想做大牛的小马| | 2014-6-12 14:09 | 只看该作者
1.输入是否有值?
2.看看reg里面是否有值?看代码有好多除法运算在里面。。。。

使用特权

评论回复
8
mmuuss586| | 2014-6-12 14:44 | 只看该作者
本帖最后由 mmuuss586 于 2014-6-12 14:45 编辑

//这是我的ADC初始化程序,你可以参考下;
这几天正调试407的,ADC这块一直没啥问题:D
void ADC1_CH12_DMA_Config(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
  GPIO_InitTypeDef      GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  /* DMA2 Stream0 channel2 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  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_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);

  /* Configure ADC3 Channel13 pin as analog input ******************************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* ADC Common Init **********************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);

  /* ADC3 Init ****************************************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;        
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC3 regular channel13 configuration *************************************/
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_3Cycles);

/* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

  /* Enable ADC3 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC3 */
  ADC_Cmd(ADC1, ENABLE);
        
        ADC_SoftwareStartConv(ADC1);
}

使用特权

评论回复
9
windit|  楼主 | 2014-6-12 14:47 | 只看该作者
mmuuss586 发表于 2014-6-12 14:44
//这是我的ADC初始化程序,你可以参考下;
这几天正调试407的,ADC这块一直没啥问题
void ADC1_CH12_DMA_C ...

谢谢!我参考参考。。。

使用特权

评论回复
10
mmuuss586| | 2014-6-12 14:49 | 只看该作者
windit 发表于 2014-6-12 14:47
谢谢!我参考参考。。。

DMA_InitStructure.DMA_Channel = DMA_Channel_1;
这句DMA通道改成0

使用特权

评论回复
11
wkdxuelei| | 2014-6-12 16:33 | 只看该作者
AD_Value定义的是二维数组? DMA出来的数据直接在AD_Value里面,需要对他进行操作,做好这点离成功就不远了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

20

帖子

2

粉丝