打印

stm32f103 多路采样的 但是不能使用DMA

[复制链接]
3133|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yangjizhufei|  楼主 | 2013-6-13 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我需要2路AD采样,每路对应8个通道,规则顺序采样,不能用DMA,因为我要严格控制时序。
初始化如下:
void ADCInit(void)   
{
          ADC_InitTypeDef ADC_InitStructure;
          GPIO_InitTypeDef GPIO_InitStructure;
          DMA_InitTypeDef DMA_InitStructure;
    /* Enable GPIOA clock                                                       */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  /* Configure PA0-PA7 (ADC Channel0-Channel7) as analog input                             */
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Configure PB0-PB1 (ADC Channel8-Channel9) as analog input                             */
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* Configure PC0-PC5 (ADC Channel10-Channel5) as analog input                             */
  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);
       
   /* Enable ADC1 and GPIOC clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);               
   /* Enable ADC2 and GPIOC clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE);                               
        //ADC配置
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC1工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                //模数转换工作在多通道模式还是单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在连续转换模式还是单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 8;               //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
        ADC_Init(ADC1, &ADC_InitStructure);

        //ADC配置
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                //模数转换工作在多通道模式还是单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在连续转换模式还是单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 8;               //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
        ADC_Init(ADC2,&ADC_InitStructure);
        /* ADC1 regular channels configuration [规则模式通道配置]*/
        //ADC1规则通道配置
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期

        /* ADC2regular channels configuration [规则模式通道配置]*/
        //ADC2 规则通道配置
  ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 3, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 4, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 5, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 6, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
  ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 7, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 8, ADC_SampleTime_1Cycles5);          //通道11采样时间 55.5周期
        //使能ADC1
        ADC_Cmd(ADC1, ENABLE);       
       
        // 初始化ADC1校准寄存器
        ADC_ResetCalibration(ADC1);
        //检测ADC1校准寄存器初始化是否完成
        while(ADC_GetResetCalibrationStatus(ADC1));
       
        //开始校准ADC1
        ADC_StartCalibration(ADC1);
        //检测是否完成校准
        while(ADC_GetCalibrationStatus(ADC1));
       
        //ADC1转换启动
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);         
                //使能ADC2
        ADC_Cmd(ADC2, ENABLE);       
       
        // 初始化ADC2校准寄存器
        ADC_ResetCalibration(ADC2);
        //检测ADC2校准寄存器初始化是否完成
        while(ADC_GetResetCalibrationStatus(ADC2));
       
        //开始校准ADC2
        ADC_StartCalibration(ADC2);
        //检测是否完成校准
        while(ADC_GetCalibrationStatus(ADC2));
       
        //ADC2转换启动
        ADC_SoftwareStartConvCmd(ADC2, ENABLE);         

}

但是我不知道如何调用??????????
我的想法是只需要两个函数调用即可。
ADCDataGet(ADC1,ADC_data);
ADCDataGet(ADC2,ADC_data+8);
ADC_data是16个字节的数组。。。。。。。。。。。。。。。。
沙发
mmuuss586| | 2013-6-13 11:56 | 只看该作者

使用特权

评论回复
板凳
airwill| | 2013-6-13 11:58 | 只看该作者
每路对应8个通道,规则顺序采样,不能用DMA.
有两个办法.
1. 设置规则8个通道, 然后设置规则间断模式.
2. 设置规则1个通道, 每次采样后更改通道设置.  这个办法比1. 虽然麻烦一些, 但出错的机会小很多

使用特权

评论回复
地板
yangjizhufei|  楼主 | 2013-6-13 19:24 | 只看该作者
因为我对采样时间有要求尽量短 ,1. 设置规则8个通道, 然后设置规则间断模式.
,,这个 有没有什么例程 ,我可以参考一下

使用特权

评论回复
5
cjhk| | 2013-6-13 22:01 | 只看该作者
帮你顶一个   呼唤一下版主   应该有能力解决这个问题     

使用特权

评论回复
6
yangjizhufei|  楼主 | 2013-6-14 14:08 | 只看该作者
版主,呼唤 版主,出来

使用特权

评论回复
7
hawksabre| | 2013-6-14 19:11 | 只看该作者
可能是寄存器不是很熟悉  楼主  仔细查一查吧

使用特权

评论回复
8
yangjizhufei|  楼主 | 2013-6-16 08:37 | 只看该作者
版主,呼唤一下版主出来支持

使用特权

评论回复
9
happyjing| | 2013-6-16 17:12 | 只看该作者
你上面的程序不是写的挺好的吗  间断模式自己写不就行了  数据手册上都有

使用特权

评论回复
10
trumpxp| | 2013-6-16 20:11 | 只看该作者
不是很了解啊    楼主   帮你顶一个

使用特权

评论回复
11
767598314| | 2013-7-9 16:35 | 只看该作者
你定时器的时间到了以后,直接调用ADC_GetConversionValue(ADC_TypeDef* ADCx) 不就行了吗,返回的不就是采样的结果吗?不知道是不是你想要的结果。

使用特权

评论回复
12
hkcj| | 2013-7-9 18:41 | 只看该作者
不是很了解这一块     楼主   兄弟帮你顶一个    希望有高手能解决这问题

使用特权

评论回复
13
yzzly| | 2013-7-10 09:13 | 只看该作者
如果你的系统任务较多,不用DMA的话CPU除了勉强做ADC外其它的什么也干不了!

使用特权

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

本版积分规则

5

主题

11

帖子

0

粉丝