打印

ADC共使用4通道,每次2通道通过DMA读取;怎么实现2组切换?

[复制链接]
3229|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzb186|  楼主 | 2010-3-31 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在我的程序里面需要用到ADC的4个通道,
1.ADC1_0,ADC2_1为一组,负责320组数据,每次16个数据的采集工作;
2.ADC1_10,ADC2_11为一组,负责对另外输入ADC信号进行处理;
两组不会同时工作,请问程序中怎么样设置和实现?
沙发
wangzb186|  楼主 | 2010-3-31 16:37 | 只看该作者
void         ADC_Configuration(void)                 {
        ADC_InitTypeDef ADC_InitStructure;
        ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC1和ADC2工作在独立模式
          ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //指定转换工作在扫描(多信道)模式
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//指定转换工作在连续模式
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                         //由软件控制开始转换,而不是外部触发器。
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
          ADC_InitStructure.ADC_NbrOfChannel = 1;        //指定将要进行转换的ADC 信道号1
          ADC_Init(ADC1, &ADC_InitStructure);
          ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);        //ADC1 regular channels configuration
          ADC_DMACmd(ADC1, ENABLE);                 //使能ADC1 DMA请求
                                                                       
        ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;     //配置
          ADC_InitStructure.ADC_ScanConvMode = ENABLE;
          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(ADC2, &ADC_InitStructure);
           ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);  /* ADC2 regular channels configuration */
          ADC_ExternalTrigConvCmd(ADC2, ENABLE);                                  /* Enable ADC2 external trigger conversion */
          ADC_DMACmd(ADC2, ENABLE);
       
        ADC_Cmd(ADC1, ENABLE);           //使能ADC1外围模块
          ADC_TempSensorVrefintCmd(ENABLE);                                                //Enable Vrefint channel17
        ADC_ResetCalibration(ADC1);        //重置ADC1校准寄存器
          while(ADC_GetResetCalibrationStatus(ADC1));        //等待ADC1校准寄存器准备就绪
        ADC_StartCalibration(ADC1);          //开始ADC1校准过程
          while(ADC_GetCalibrationStatus(ADC1));          //等待ADC1校准过程结束
        ADC_Cmd(ADC2, ENABLE);  /* Enable ADC2 */
        ADC_ResetCalibration(ADC2);         /* Enable ADC2 reset calibaration register */
          while(ADC_GetResetCalibrationStatus(ADC2));        /* Check the end of ADC2 reset calibration register */
        ADC_StartCalibration(ADC2);          /* Start ADC2 calibaration */
          while(ADC_GetCalibrationStatus(ADC2));   /* Check the end of ADC2 calibration */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Start ADC1 Software Conversion */
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));         /* Test on DMA1 channel1 transfer complete flag */
          DMA_ClearFlag(DMA1_FLAG_TC1);        /* Clear DMA1 channel1 transfer complete flag */
}

使用特权

评论回复
板凳
wangzb186|  楼主 | 2010-3-31 16:38 | 只看该作者
上面的是第一组ADC的初始化函数,第二种类似处理;现在不知道怎么样让DMA处理的时候可以在2组中间进行相应切换,请大家赐教!

使用特权

评论回复
地板
香水城| | 2010-3-31 17:07 | 只看该作者
只需要改变ADC模块的配置,不需要改变DMA模块的配置。

使用特权

评论回复
5
wangzb186|  楼主 | 2010-3-31 17:31 | 只看该作者

这个是同步规则的模式,现在我有定义ADC1中0和10,ADC中1和11,
1.请问如果采用DMA模式,读到的是否为0,1;10,11;0,1;10,11依次类推?
2.如何可以实现只读取其中一组数据?

使用特权

评论回复
6
香水城| | 2010-3-31 17:45 | 只看该作者
你应该在处理第一组时配置一次,只需配置通道0和1;然后在处理第二组时再配置一次,只需配置通道10和11。

不能只进行一次的配置。

使用特权

评论回复
7
wangzb186|  楼主 | 2010-3-31 17:58 | 只看该作者
现在我的ADC初始化函数有2个,按照2个组来写的;调用ADC_Configuration配置ADC1_0和ADC2_1;调用ADC_Configuration2配置ADC1_10和ADC2_11。
按照你的说法第1次调用ADC_Configuration,第2次ADC_Configuration2函数调用的时候,第1次调用ADC_Configuration里面的ADC1_0和ADC2_1通道会自动关闭。
不用把第1次调用配置的通道用什么方法关闭对吧?

使用特权

评论回复
8
香水城| | 2010-3-31 18:06 | 只看该作者
怎么叫关闭?

因为ADC_NbrOfChannel = 1,每个ADC模块只有一个通道参与转换,怎么会有关不关闭的问题?

使用特权

评论回复
9
wangzb186|  楼主 | 2010-3-31 18:22 | 只看该作者
哦,明白了。谢谢

使用特权

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

本版积分规则

1

主题

10

帖子

0

粉丝