打印
[STM32F3]

SDADC 多通道数据采集 有偿

[复制链接]
3698|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengshang1122|  楼主 | 2014-1-16 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁编写过SDADC多通道数据采集,有偿求程序
沙发
wangzhihai1986| | 2014-1-16 17:59 | 只看该作者
你可以参考ST提供的例子,没有多难的,和12位的ADC类似。

使用特权

评论回复
板凳
fengshang1122|  楼主 | 2014-1-16 19:25 | 只看该作者
wangzhihai1986 发表于 2014-1-16 17:59
你可以参考ST提供的例子,没有多难的,和12位的ADC类似。

单通道的调通了,多通道的怎么整也没成功啊,很急啊

使用特权

评论回复
地板
airwill| | 2014-1-16 22:15 | 只看该作者
其实这只是个设置问题, F3 的公共寄存器区设置, 可能给编程带来一些不习惯的差异.
多看一遍手册吧

使用特权

评论回复
5
airwill| | 2014-1-17 12:23 | 只看该作者
"我现在SDADC单通道调试可以运行,但是设置多通道时,我调用各通道地址获得转换的数据,会出现混乱"

能否详细说说你遇到的问题?
包括信号源的情况也介绍一下

使用特权

评论回复
6
fengshang1122|  楼主 | 2014-1-17 13:53 | 只看该作者
airwill 发表于 2014-1-17 12:23
"我现在SDADC单通道调试可以运行,但是设置多通道时,我调用各通道地址获得转换的数据,会出现混乱"

能否 ...

if(ChannelIndex=0x00020004)
   {InjectedConvData1 = SDADC_GetInjectedConversionValue(SDADC2,&ChannelIndex);
                t2=InjectedConvData1;
                t2=t2* 3300 /0.5/65536;//GAIN is 0.5
                InjectedConvData1=t2;
                sprintf(str1, "%04x", InjectedConvData1);
                UART3_Send_Str(str1);}

/*if(ChannelIndex=0x00010002)
   {InjectedConvData2= SDADC_GetInjectedConversionValue(SDADC2,&ChannelIndex);
                t3=InjectedConvData2 ;
                t3=t3* 3300 /0.5/65536;//GAIN is 0.5
                InjectedConvData2=t3;
                sprintf(str2, "%04x", InjectedConvData2);
                UART3_Send_Str(str2);}*/
通道地址对应着相应的通道,我传感器接电路板的输入,对应相应的SDADC通道SDADC_ChannelConfig(SDADC2, SDADC_Channel_3, SDADC_Conf_0);
        SDADC_InjectedChannelSelect(SDADC2, SDADC_Channel_3);
SDADC_ChannelConfig(SDADC2, SDADC_Channel_2, SDADC_Conf_0);
        SDADC_InjectedChannelSelect(SDADC2, SDADC_Channel_2);
         SDADC_ChannelConfig(SDADC2, SDADC_Channel_1, SDADC_Conf_0);
        SDADC_InjectedChannelSelect(SDADC2, SDADC_Channel_1);
,但是接上一个传感器,无论是采用哪个通道,都会得到一样的采样数值,通道设定的无意义了

使用特权

评论回复
7
mthgh0818| | 2015-5-22 15:17 | 只看该作者
楼主,你的多通道采样问题解决了吗?如果可以的话麻烦把你的例程发给我一份,我的邮箱是mthgh0818@163.com

使用特权

评论回复
8
ouyangchun| | 2016-3-29 16:51 | 只看该作者
这个问题解决了没有?能否说一下啊。

使用特权

评论回复
9
Crystal6927| | 2017-2-9 09:23 | 只看该作者
楼主,你好,想请教您[STM32F3] SDADC 多通道数据采集的问题,我也是单通道调试可以运行,但是设置多通道时,我调用各通道地址获得转换的数据会混乱。

使用特权

评论回复
10
734774645| | 2017-2-9 18:20 | 只看该作者
目前采用的是F373的芯片,采用的是SDADC_InputMode_SEOffset模式,参考了论坛里的例程,今天刚调通,需要的朋友可以参考一下。
1)我猜测f3函数库中库函数SDADC_InjectedChannelSelect()是有问题的,如图1和图2,SDADC_JCHGR是配置注入组的,SDADC_InjectedChannelSelect使用的是赋值不是或运算,这样如果配置多个通道,后面配置的通道会把之前的覆盖了,导致只能配置一个通道。
2)例程如下:

void SDADC_Configuration(void)
{

SDADC_AINStructTypeDef        ADC_AINStructure;
SDADC_InitTypeDef        SDADC_InitStructure;
           GPIO_InitTypeDef GPIO_InitStructure;
int SDADCTimeout=0;
/* Enable clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_1,ENABLE);

RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div14);

//===============ADC 输入 端口设置 ==================================================
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
           GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOE, &GPIO_InitStructure);

SDADC_DeInit(SDADC1);

SDADC_VREFSelect(SDADC_VREF_Ext);

Delay(5);

SDADC_Cmd(SDADC1, ENABLE);

SDADC_InitModeCmd(SDADC1, ENABLE);

while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INITRDY) == RESET));

//SDADC_DeInit(SDADC1);
/* ADC1 configuration ------------------------------------------------------*/
ADC_AINStructure.SDADC_InputMode=SDADC_InputMode_SEOffset;
ADC_AINStructure.SDADC_Gain=SDADC_Gain_1_2;
ADC_AINStructure.SDADC_CommonMode=SDADC_CommonMode_VSSA;
ADC_AINStructure.SDADC_Offset=0;
SDADC_AINInit(SDADC1,SDADC_Conf_0,&ADC_AINStructure);

SDADC_DMAConfig(SDADC1,SDADC_DMATransfer_Injected, ENABLE);

SDADC_ChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_8, SDADC_Conf_0);

SDADC_InjectedChannelSelect(SDADC1,SDADC_Channel_8|SDADC_Channel_4);//必须这样才可以,分开配置的话后面配置的通道会覆盖前面的。

SDADC_InjectedContinuousModeCmd(SDADC1,ENABLE);

SDADC_InitModeCmd(SDADC1, DISABLE);

SDADC_CalibrationSequenceConfig(SDADC1, SDADC_CalibrationSequence_1);

SDADC_StartCalibration(SDADC1);
/* Set calibration timeout: 5.12 ms at 6 MHz in a single calibration sequence */
SDADCTimeout = 4*30720 ;

/* wait for PT100_SDADC Calibration process to end */
while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_EOCAL) == RESET) && (--SDADCTimeout != 0));
if(SDADCTimeout == 0)
{
/* EOCAL flag can not set */
return ;
}
SDADC_SoftwareStartInjectedConv(SDADC1);

}

void DMA_Config(void)
{
DMA_InitTypeDef   DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);

DMA_DeInit(DMA2_Channel3); //恢复默认值,这个是必要的

/* DMA channel1 configuration ----------------------------------------------*/
DMA_InitStructure.DMA_PeripheralBaseAddr = SDADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr =(u32) SDADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = SDAD_NUM;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 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_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);

NVIC_Configuration();
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);        //DMA通道1传输完成中断

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

}


使用特权

评论回复
11
734774645| | 2017-2-9 18:20 | 只看该作者
看别人发的,挺好,分享来给大家。

使用特权

评论回复
12
aspoke| | 2017-2-9 22:47 | 只看该作者
现在的ST带有很多的参考例程

使用特权

评论回复
13
aspoke| | 2017-2-9 22:51 | 只看该作者
内部的ADC确实很好用。

使用特权

评论回复
14
lengruobing| | 2017-2-10 09:09 | 只看该作者
参考例程

使用特权

评论回复
15
Hazelhyd| | 2018-4-12 14:41 | 只看该作者
请问大家这16位AD的采样率最大能达到多少呢?

使用特权

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

本版积分规则

6

主题

14

帖子

0

粉丝