OpenEdv-开源电子网

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

关于adc多路采集信号互相干扰问题

[复制链接]

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
发表于 2015-12-8 17:03:24 | 显示全部楼层 |阅读模式
5金钱
我设定4路adc_dma采集信号,PA0到PA3 4个管脚。然后只接了一路红外,串口打印数据的时候出现的数据都是却出现干扰,就是一路动了之后其他几路都动

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

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 17:05:44 | 显示全部楼层
[mw_shl_code=c,true] #include "adc.h" #include "delay.h" #include "stm32f10x_flash.h" #include "dma.h" #include "stdlib.h" #include "usart.h" #include "math.h" #include "stm32f10x_dma.h" #define N 30 //???ù???? #define M 4 //???ù?¨?? float y[2][M],speed[M];// float value[4][M]; extern vu16 After_filter[M]; //???ù?ó???? /*×??±???è??*/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); //RCC ???? RCC_HSEConfig(RCC_HSE_ON); //??HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //??HSE??? if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72 MHz RCC_PLLCmd(ENABLE); //Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source /*RCC?±??????*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //??ADC1????,?????? /* Configure ADCCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); //?è??ADC·????ò×?6 72M/6=12,ADC×??ó?±??????????14M RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA?±?? } } void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //PA1 ×÷???????¨?????????? 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); ADC_DeInit(ADC1); //????ADC1,?????è ADC1 ???????????÷???è???±???? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????: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 = M; //???ò???????ò×?????ADC?¨???????? ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );//????adc1???¨????±é?ú???? ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1 ADC_DMACmd(ADC1, ENABLE); //????adc dam?§?? ADC_ResetCalibration(ADC1); //??????????×? while(ADC_GetResetCalibrationStatus(ADC1)&&ADC_GetResetCalibrationStatus(ADC2)); //??????????×??á?? ADC_StartCalibration(ADC1); //????AD??×? while(ADC_GetCalibrationStatus(ADC1)); //??????×??á?? } void ADC_Speed(void) { int i,j; for(j=0;j<2;j++) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);// filter(); for(i=0;i<M;i++) { value[j]= GetVolt(After_filter); y[j]= -14.8939 * pow( value[j],5)+ 133.1041* pow( value[j],4)-470.0798* pow( value[j],3) + 831.7562 * pow( value[j],2)-773.2520* value[j]+ 356.1651; } delay_ms(30); } // ADC_DMACmd(ADC1, DISABLE);//????adc_DMA ???????????? //???????·???? for(i=0;i<4;i++) { if(fabs(y[1]-y[0])>5||fabs(y[1]-y[0])<0.1) y[1] =y[0]; speed= floor((y[1]-y[0])/0.03); printf("\t speed[%d] %f \n",i,speed) ; } } [/mw_shl_code]


回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 17:06:27 | 显示全部楼层



[mw_shl_code=c,true]#include "dma.h" #include "stm32f10x_dma.h" #include "stdlib.h" u16 DMA1_MEM_LEN;//±???DMA???????????????¤?? int i; #define N 20 //???ù???? #define M 4 //???ù?¨?? vu16 AD_Value[N][M]; //??????·?adc??????????dma?????· vu16 After_filter[M]; //???ù?ó???? DMA_InitTypeDef DMA_InitStructure; void DMA_Configuration(void) { /* ADC1 DMA1 Channel Config */ DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); //?DMA?¨??1 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA???èADC?????· DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA?????ù???· DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //????×÷????·????????? DMA_InitStructure.DMA_BufferSize = N*M; //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?????????? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA??DMA??±? DMA_Init(DMA1_Channel1, &DMA_InitStructure); //?????? } //????????dma?¨?? void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)//????DMA1_CHx { DMA_Cmd(DMA_CHx, DISABLE ); //??±?USART1 TX DMA1 ?ù???????¨?? DMA_SetCurrDataCounter(DMA1_Channel4,N*M);//DMA?¨????DMA???????ó?? DMA_Cmd(DMA_CHx, ENABLE); //????USART1 TX DMA1 ?ù???????¨?? } float GetVolt(u16 advalue) { return (float)advalue*(3.3/4096); } /*??????*/ void filter(void) { int i,j=0; //int input[2]={0 ,0}; int sum = 0; u8 count; vu16 value_buf[N]; /*??·ù???ù*/ /* for (i=0;i<2;i++) { for ( count=0;count<N;count++) { input[1]=input[0]; input[0]= AD_Value[count]; if(abs(input[1]-input[0])>60) AD_Value[count]=input[1]; sum += AD_Value[count]; } After_filter=sum/(N-1); sum=0; }*/ /*???ù???¨*/ MYDMA_Enable(DMA1_Channel1) ; for (i=0;i<2;i++) { for ( count=0;count<N;count++) { sum += AD_Value[count]; } After_filter=sum/N; sum=0; } } [/mw_shl_code]


回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 17:12:20 | 显示全部楼层
上面的给我改的面目全非了~~~,等会我吃个饭还原一下
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-8 17:13:06 | 显示全部楼层
打印的时候停止AD呢?
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 18:33:01 | 显示全部楼层
回复【5楼】ricefat:
---------------------------------
ADC_Cmd(ADC1, DISABLE);

for(i=0;i<4;i++)
 {
 if(fabs(y[1]-y[0])>5||fabs(y[1]-y[0])<0.1)
y[1] =y[0];
 
speed= floor((y[1]-y[0])/0.03);
 printf("\t speed[%d]  %f \n",i,speed) ;

}ADC_Cmd(ADC1, ENABLE);

是指这样吗? 我试试
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 18:44:20 | 显示全部楼层
[mw_shl_code=c,true]#include "adc.h" #include "delay.h" #include "stm32f10x_flash.h" #include "dma.h" #include "stdlib.h" #include "usart.h" #include "math.h" #include "stm32f10x_dma.h" #define N 30 //???ù???? #define M 4 //???ù?¨?? float y[2][M],speed[M];// float value[4][M]; extern vu16 After_filter[M]; //???ù?ó???? /*×??±???è??*/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); //RCC ???? RCC_HSEConfig(RCC_HSE_ON); //??HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //??HSE??? if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72 MHz RCC_PLLCmd(ENABLE); //Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source /*RCC?±??????*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //??ADC1????,?????? /* Configure ADCCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); //?è??ADC·????ò×?6 72M/6=12,ADC×??ó?±??????????14M RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA?±?? } } void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //PA1 ×÷???????¨?????????? 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); ADC_DeInit(ADC1); //????ADC1,?????è ADC1 ???????????÷???è???±???? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????: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 = M; //???ò???????ò×?????ADC?¨???????? ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );//????adc1???¨????±é?ú???? ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1 ADC_DMACmd(ADC1, ENABLE); //????adc dam?§?? ADC_ResetCalibration(ADC1); //??????????×? while(ADC_GetResetCalibrationStatus(ADC1)&&ADC_GetResetCalibrationStatus(ADC2)); //??????????×??á?? ADC_StartCalibration(ADC1); //????AD??×? while(ADC_GetCalibrationStatus(ADC1)); //??????×??á?? } void ADC_Speed(void) { int i=0,j=0; ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ad???????? DMA_Cmd(DMA1_Channel1, ENABLE); //????dma1????1???¨?? for(j=0;j<2;j++) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);// filter(); for(i=0;i<M;i++) { value[j]= GetVolt(After_filter); y[j]= -14.8939 * pow( value[j],5)+ 133.1041* pow( value[j],4)-470.0798* pow( value[j],3) + 831.7562 * pow( value[j],2)-773.2520* value[j]+ 356.1651; } delay_ms(30); } ADC_SoftwareStartConvCmd(ADC1, DISABLE); for(i=0;i<4;i++) { if(fabs(y[1]-y[0])>5||fabs(y[1]-y[0])<0.1) y[1] =y[0]; speed= floor((y[1]-y[0])/0.03); printf("\t speed[%d] %f \n",i,speed) ; } } [/mw_shl_code]

回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 18:45:39 | 显示全部楼层
回复【7楼】块垒:
---------------------------------
改了下,采样频率。还有在传输的时候把ad关了。但是还是有干扰。就是没有刚开始那么大了
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 18:52:25 | 显示全部楼层
 speed[0]  4.000000 
speed[1]  26.000000 
speed[2]  11.000000 
speed[3]  0.000000 
speed[0]  0.000000 
speed[1]  40.000000 
speed[2]  21.000000 
speed[3]  7.000000 
speed[0]  0.000000 
speed[1]  45.000000 
speed[2]  27.000000 
speed[3]  10.000000 
speed[0]  0.000000 
speed[1]  14.000000 
speed[2]  7.000000 
speed[3]  3.000000 
speed[0]  4.000000 
speed[1]  27.000000 
speed[2]  23.000000 
speed[3]  15.000000 
speed[0]  -5.000000 
speed[1]  -15.000000 
speed[2]  -10.000000 
speed[3]  0.000000 
我只在speed【1】有输入 但是其他3个通道都出现了递减的数值
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 19:02:45 | 显示全部楼层
[mw_shl_code=c,true]#include "dma.h" #include "stm32f10x_dma.h" #include "stdlib.h" #include "delay.h" u16 DMA1_MEM_LEN;//±???DMA???????????????¤?? int i; #define N 20 //次数 #define M 4 //通道 vu16 AD_Value[N][M]; //存放地址 vu16 After_filter[M]; //通道的 平均值存放地址 DMA_InitTypeDef DMA_InitStructure; void DMA_Configuration(void) { /* ADC1 DMA1 Channel Config */ DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); //?DMA?¨??1 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA???èADC?????· DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA?????ù???· DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //????×÷????·????????? DMA_InitStructure.DMA_BufferSize = N*M; //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?????????? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA??DMA??±? DMA_Init(DMA1_Channel1, &DMA_InitStructure); //?????? } //????????dma?¨?? /* void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)//????DMA1_CHx { DMA_Cmd(DMA_CHx, DISABLE ); //??±?USART1 TX DMA1 ?ù???????¨?? DMA_SetCurrDataCounter(DMA1_Channel4,N*M);//DMA?¨????DMA???????ó?? DMA_Cmd(DMA_CHx, ENABLE); //????USART1 TX DMA1 ?ù???????¨?? }*/ float GetVolt(u16 advalue) { return (float)advalue*(3.3/4096); } /*求平均值函数*/ void filter(void) { int i,j=0; //int input[2]={0 ,0}; int sum = 0; u8 count; // vu16 value_buf[N]; /*??·ù???ù*/ /* for (i=0;i<2;i++) { for ( count=0;count<N;count++) { input[1]=input[0]; input[0]= AD_Value[count]; if(abs(input[1]-input[0])>60) AD_Value[count]=input[1]; sum += AD_Value[count]; } After_filter=sum/(N-1); sum=0; }*/ /*平均值滤波法*/ for (i=0;i<M;i++)//通道循环 { for ( count=0;count<N;count++)//次数循环 { sum += AD_Value[count];//采样次数相加 } After_filter=sum/N;//通道值 delay_ms(1);//延时1ms取下一个通道 sum=0; } } [/mw_shl_code]

回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 19:03:15 | 显示全部楼层
是我的dma 搬运adc数据有错误吗?
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 19:06:57 | 显示全部楼层
[mw_shl_code=c,true]#define N 30 //???ù???? #define M 4 //???ù?¨?? extern vu16 AD_Value[N][M]; //??????·?adc??????????dma?????· extern vu16 After_filter[M]; //???ù?ó???? extern float y[2][M],speed[2]; extern float value[4][M]; int main(void) { RCC_Configuration(); delay_init(); //???±?????????? uart_init(9600); //?®??????????9600 LED_Init(); //????????LED?????????????? LCD_Init(); Adc_Init(); //ADC?????? delay_init(); DMA_Configuration();//DMA?????? delay_ms(50); DMA_Cmd(DMA1_Channel1, ENABLE); //????dma1????1???¨?? while(1) { ADC_Speed(); } } [/mw_shl_code]

回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 19:31:17 | 显示全部楼层
我试试看这个
while (1)
{
    //检查串口是否可以发送
    while (Flag_Uart_Send);
    Flag_Uart_Send = 1;
    //设置传输数据长度
    DMA_SetCurrDataCounter(DMA1_Channel4,i);
    //打开DMA
    DMA_Cmd(DMA1_Channel4,ENABLE);
    i++;
    if (i > 5)
    {
      i = 1;
    }
}
这个是我在其他网页上看到的。
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 19:34:02 | 显示全部楼层
http://www.amobbs.com/archiver/tid-5636764.html
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 20:51:27 | 显示全部楼层
加了个DMA中断,但是还是有干扰
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 20:52:12 | 显示全部楼层
DMA_Cmd(DMA1_Channel1, ENABLE);         //????dma1????1???¨??
DMA_NVIC_Configuration();//开启DMA中断
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ad????????
DMA_Cmd(DMA1_Channel1, ENABLE);         //????dma1????1???¨??
while (1)

{
ADC_Speed();
}     

}




#include "stdlib.h"
#include "stm32f10x_dma.h"

#define  N   20               //???ù????
#define  M  4              //???ù?¨??

 extern vu16  AD_Value[N][M];   //??????·?adc??????????dma?????·
  vu16  After_filter[M];    //???ù?ó????

void DMA1_Channel1_IRQHandler ()
{
int i,j=0;
int input[2]={0 ,0};
  int  sum = 0;
  u8  count;    
 // vu16 value_buf[N];
/*??·ù???ù*/

for (i=0;i<M;i++)
{
         for ( count=0;count<N;count++)


          {

input[1]=input[0];
input[0]= AD_Value[count];
if(abs(input[1]-input[0])>20)
AD_Value[count]=input[1];
            sum += AD_Value[count];

          }

          After_filter=sum/(N-1);

          sum=0;
      }
 DMA_ClearFlag(DMA_ISR_TCIF1);
}

回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-8 20:54:33 | 显示全部楼层
求大神帮忙啊!!!!
回复

使用道具 举报

18

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2015-11-1
在线时间
49 小时
发表于 2015-12-8 21:48:24 | 显示全部楼层
这是用的什么软件编写的
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 11:22:32 | 显示全部楼层
回复【18楼】小可爱:
---------------------------------
kile5啊
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 11:43:16 | 显示全部楼层
测试了下,发现不是adc的问题。单adc,cpu控制通道跳转时除了速度慢一切没问题。也就是说错误出在DMA上面。那为什么DMA会出现数据错位呢?我运算数值用的也是dma的完成中断啊~~
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 11:44:12 | 显示全部楼层
回复【5楼】ricefat:
---------------------------------
测试了下,发现不是adc的问题。单adc,cpu控制通道跳转时除了速度慢一切没问题。也就是说错误出在DMA上面。那为什么DMA会出现数据错位呢?我运算数值用的也是dma的完成中断啊~~
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 14:25:59 | 显示全部楼层
[mw_shl_code=c,true] #include "adc.h" #include "delay.h" #include "stm32f10x_flash.h" #include "dma.h" #include "stdlib.h" #include "usart.h" #include "math.h" #include "stm32f10x_dma.h" #define N 20 //???ù???? #define M 4 //???ù?¨?? float y[2][M],speed[M];// float value[2][M]; extern vu16 After_filter[M]; //???ù?ó???? /*×??±???è??*/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_DeInit(); //RCC ???? RCC_HSEConfig(RCC_HSE_ON); //??HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //°???8Mhz if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); //????2?????? RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8); //±??? 8M*8=64Mhz RCC_PLLCmd(ENABLE); //Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source /*RCC?±??????*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //??ADC1????,?????? /* Configure ADCCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div8);//PCLK2/8=9Mhz ADC×??ó?±??????????14M RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA?±?? } } void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //PA0 1 ×÷???????¨?????????? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //???????????? GPIO_Init(GPIOA, &GPIO_InitStructure); //PB0 1 ADC8 ADC9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //???????????? GPIO_Init(GPIOB, &GPIO_InitStructure); ADC_DeInit(ADC1); //????ADC1,?????è ADC1 ???????????÷???è???±???? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????: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 = M; //???ò???????ò×?????ADC?¨???????? ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 4, ADC_SampleTime_239Cycles5 );//????adc1???¨????±é?ú???? ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1 ADC_DMACmd(ADC1, ENABLE); //????adc dam?§?? ADC_ResetCalibration(ADC1); //??????????×? while(ADC_GetResetCalibrationStatus(ADC1)&&ADC_GetResetCalibrationStatus(ADC2)); //??????????×??á?? ADC_StartCalibration(ADC1); //????AD??×? while(ADC_GetCalibrationStatus(ADC1)); //??????×??á?? } void ADC_Speed(void) { int i=0,j=0; for(j=0;j<2;j++) { ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ad???????? while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);// for(i=0;i<M;i++) { value[j]= GetVolt(After_filter); y[j]= -14.8939 * pow( value[j],5)+ 133.1041* pow( value[j],4)-470.0798* pow( value[j],3) + 831.7562 * pow( value[j],2)-773.2520* value[j]+ 356.1651; } ADC_SoftwareStartConvCmd(ADC1, DISABLE); delay_ms(30); } for(i=0;i<4;i++) { if(fabs(y[1]-y[0])>5||fabs(y[1]-y[0])<0.1) y[1] =y[0]; speed= floor((y[1]-y[0])/0.03); printf("\t speed[%d] %f \n",i,speed) ; } } [/mw_shl_code]

回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 18:13:06 | 显示全部楼层
什么鬼啊!啊啊啊啊啊啊!弄了一天了还是不行。
回复

使用道具 举报

3

主题

45

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-8-14
在线时间
3 小时
 楼主| 发表于 2015-12-9 18:15:02 | 显示全部楼层
召唤原子哥啊啊啊啊!小弟跪了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 20:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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