stm32双ad采集
时间:10-02
整理:3721RD
点击:
想利用C1C4端口采集两路ad值,但是第二路一直失败,请教各位
#include <ccd.h>
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
unsigned char ad[128];//2é?ˉμ?μ?128??μ?ad?μ
unsigned char ad_[43];//·???′|àíoóμ?43????óòad
unsigned char ad_cl[43];//43????óò?t?μ?ˉoóêy?Y
unsigned char min_ad,max_ad,fa;//ad×?′ó?μ£?×?D??μ,·§?μ
int i;
char ss1=0,n1=0,ss2=0,n2=0;
#define si1 GPIO_Pin_3
#define clk1 GPIO_Pin_2
#define si2 GPIO_Pin_4
#define clk2 GPIO_Pin_5
__IO uint32_t ADC_ConvertedValue[2];
//__IO u16 ADC_ConvertedValueLocal;
void SamplingDelay(void)
{
int i=60;
while(i--){}
}
void ccd_IOint_1(){
GPIO_InitTypeDef GPIO_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_Struct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2; //CCD1μ?si ,clk???ú C3 C2
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP ;
GPIO_Init(GPIOC,&GPIO_Struct);
}
void ccd_IOint_2(){
GPIO_InitTypeDef GPIO_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Struct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5; //CCD2μ?si ,clk???úA4 A5
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP ;
GPIO_Init(GPIOA,&GPIO_Struct);
}
void ADC1_GPIO_Config(void)// CCDμ?AD???ú????
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.0 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); //ccd1μ?AD2é?ˉ PC1,ê?è?ê±2?ó?éè???ù?ê
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); // ccd2μ?AD2é?ˉPC4,ê?è?ê±2?ó?éè???ù?ê
}
/**
* @brief ????ADC1μ?1¤×÷?£ê??aMDA?£ê?
* @param ?T
* @retval ?T
*/
void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADCμ??·
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //?ú′?μ??·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμ??·1ì?¨
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //?ú′?μ??·μY??
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(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //?àá¢ADC?£ê?
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //?a??é¨?è?£ê?
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //?a??á?D?×a???£ê?£??′2?í£μ???DDADC×a??
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //2?ê1ó?ía2?′¥·¢×a??
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //2é?ˉêy?Yóò????
ADC_InitStructure.ADC_NbrOfChannel = 2; //òa×a??μ?í¨μàêy??2
ADC_Init(ADC1, &ADC_InitStructure);
/*????ADCê±?ó£??aPCLK2μ?8·??μ£??′9MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*????ADC1μ?í¨μà11?a55. 5??2é?ù?ü?ú£?DòáD?a1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_239Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*?′??D£×???′??÷ */
ADC_ResetCalibration(ADC1);
/*μè′yD£×???′??÷?′??íê3é */
// while(ADC_GetResetCalibrationStatus(ADC1));
/* ADCD£×? */
ADC_StartCalibration(ADC1);
// /* μè′yD£×?íê3é*/
while(ADC_GetCalibrationStatus(ADC1));
//
/* óéóú??óD2éó?ía2?′¥·¢£??ùò?ê1ó?èí?t′¥·¢ADC×a?? */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
u16 ADC_Get_Value_1(void)//?áè?AD×a??oóμ?êy?μ
{
u32 a1=0;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
a1=ADC_ConvertedValue[0];
return a1;
}
u16 ADC_Get_Value_2(void)//?áè?AD×a??oóμ?êy?μ
{
u32 a2=0;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
a2=ADC_ConvertedValue[1];
return a2;
}
void ADC1_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}
void ccd_int()
{
ccd_IOint_1();
ccd_IOint_2();
ADC1_Init();
}
void ccd_1()
{ char ss1=0,n1=0,ss2=0,n2=0;
GPIO_SetBits(GPIOC,si1); /* SI = 1 */
SamplingDelay();
GPIO_SetBits(GPIOC,clk1);
SamplingDelay();
GPIO_ResetBits(GPIOC,si1); /* SI = 0 */
SamplingDelay();
SamplingDelay();
GPIO_ResetBits(GPIOC,clk1);
for(i=0; i<128; i++)
{
SamplingDelay();
GPIO_SetBits(GPIOC,clk1); /* CLK = 1 */
SamplingDelay();
SamplingDelay();
ad[i] = (u8)(ADC_Get_Value_1()>>4);
GPIO_ResetBits(GPIOC,clk1); /* CLK = 0 */
}
SamplingDelay();
GPIO_SetBits(GPIOC,clk1); /* CLK = 1 */
SamplingDelay();
GPIO_ResetBits(GPIOC,clk1); /* CLK = 0 */
ad_[42]=(ad[126]+ad[127])/2;
for(i=0;i<42;i++) //o?2¢????μ?
{
ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
}
max_ad =ad[0];
min_ad =ad[0];
for(i=0;i<42;i++)
{
if (ad_[i] > max_ad) max_ad =ad_[i];
if (ad_[i] < min_ad) min_ad =ad_[i];
}
fa = (max_ad + min_ad)*0.5;
// for(i=0;i<128;i++)
// { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
// else { ss2=ss2+ad[i];n2++; }
// }
// ss1=ss1/n1;
// ss2=ss2/n2;
// fa=(ss1+ss2)/2;
for(i=0;i<128;i++)
{ if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
else { ad[i]=0; }
}
for(i=0;i<43;i++)
{ if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
else ad_cl[i]=0;
}
}
void ccd_2()
{ char ss1=0,n1=0,ss2=0,n2=0;
GPIO_SetBits(GPIOA,si2); /* SI = 1 */
SamplingDelay();
GPIO_SetBits(GPIOA,clk2);
SamplingDelay();
GPIO_ResetBits(GPIOA,si2); /* SI = 0 */
SamplingDelay();
SamplingDelay();
GPIO_ResetBits(GPIOA,clk2);
for(i=0; i<128; i++)
{
SamplingDelay();
GPIO_SetBits(GPIOA,clk2); /* CLK = 1 */
SamplingDelay();
SamplingDelay();
ad[i] = (u8)(ADC_Get_Value_2()>>4);
GPIO_ResetBits(GPIOA,clk2); /* CLK = 0 */
}
SamplingDelay();
GPIO_SetBits(GPIOA,clk2); /* CLK = 1 */
SamplingDelay();
GPIO_ResetBits(GPIOA,clk2); /* CLK = 0 */
ad_[42]=(ad[126]+ad[127])/2;
for(i=0;i<42;i++) //o?2¢????μ?
{
ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
}
max_ad =ad[0];
min_ad =ad[0];
for(i=0;i<42;i++)
{
if (ad_[i] > max_ad) max_ad =ad_[i];
if (ad_[i] < min_ad) min_ad =ad_[i];
}
fa = (max_ad + min_ad)*0.5;
// for(i=0;i<128;i++)
// { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
// else { ss2=ss2+ad[i];n2++; }
// }
// ss1=ss1/n1;
// ss2=ss2/n2;
// fa=(ss1+ss2)/2;
for(i=0;i<128;i++)
{ if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
else { ad[i]=0; }
}
for(i=0;i<43;i++)
{ if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
else ad_cl[i]=0;
}
}
#include <ccd.h>
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
unsigned char ad[128];//2é?ˉμ?μ?128??μ?ad?μ
unsigned char ad_[43];//·???′|àíoóμ?43????óòad
unsigned char ad_cl[43];//43????óò?t?μ?ˉoóêy?Y
unsigned char min_ad,max_ad,fa;//ad×?′ó?μ£?×?D??μ,·§?μ
int i;
char ss1=0,n1=0,ss2=0,n2=0;
#define si1 GPIO_Pin_3
#define clk1 GPIO_Pin_2
#define si2 GPIO_Pin_4
#define clk2 GPIO_Pin_5
__IO uint32_t ADC_ConvertedValue[2];
//__IO u16 ADC_ConvertedValueLocal;
void SamplingDelay(void)
{
int i=60;
while(i--){}
}
void ccd_IOint_1(){
GPIO_InitTypeDef GPIO_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_Struct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2; //CCD1μ?si ,clk???ú C3 C2
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP ;
GPIO_Init(GPIOC,&GPIO_Struct);
}
void ccd_IOint_2(){
GPIO_InitTypeDef GPIO_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Struct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5; //CCD2μ?si ,clk???úA4 A5
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP ;
GPIO_Init(GPIOA,&GPIO_Struct);
}
void ADC1_GPIO_Config(void)// CCDμ?AD???ú????
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.0 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); //ccd1μ?AD2é?ˉ PC1,ê?è?ê±2?ó?éè???ù?ê
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); // ccd2μ?AD2é?ˉPC4,ê?è?ê±2?ó?éè???ù?ê
}
/**
* @brief ????ADC1μ?1¤×÷?£ê??aMDA?£ê?
* @param ?T
* @retval ?T
*/
void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADCμ??·
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //?ú′?μ??·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμ??·1ì?¨
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //?ú′?μ??·μY??
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(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //?àá¢ADC?£ê?
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //?a??é¨?è?£ê?
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //?a??á?D?×a???£ê?£??′2?í£μ???DDADC×a??
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //2?ê1ó?ía2?′¥·¢×a??
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //2é?ˉêy?Yóò????
ADC_InitStructure.ADC_NbrOfChannel = 2; //òa×a??μ?í¨μàêy??2
ADC_Init(ADC1, &ADC_InitStructure);
/*????ADCê±?ó£??aPCLK2μ?8·??μ£??′9MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*????ADC1μ?í¨μà11?a55. 5??2é?ù?ü?ú£?DòáD?a1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_239Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*?′??D£×???′??÷ */
ADC_ResetCalibration(ADC1);
/*μè′yD£×???′??÷?′??íê3é */
// while(ADC_GetResetCalibrationStatus(ADC1));
/* ADCD£×? */
ADC_StartCalibration(ADC1);
// /* μè′yD£×?íê3é*/
while(ADC_GetCalibrationStatus(ADC1));
//
/* óéóú??óD2éó?ía2?′¥·¢£??ùò?ê1ó?èí?t′¥·¢ADC×a?? */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
u16 ADC_Get_Value_1(void)//?áè?AD×a??oóμ?êy?μ
{
u32 a1=0;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
a1=ADC_ConvertedValue[0];
return a1;
}
u16 ADC_Get_Value_2(void)//?áè?AD×a??oóμ?êy?μ
{
u32 a2=0;
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET){}
a2=ADC_ConvertedValue[1];
return a2;
}
void ADC1_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}
void ccd_int()
{
ccd_IOint_1();
ccd_IOint_2();
ADC1_Init();
}
void ccd_1()
{ char ss1=0,n1=0,ss2=0,n2=0;
GPIO_SetBits(GPIOC,si1); /* SI = 1 */
SamplingDelay();
GPIO_SetBits(GPIOC,clk1);
SamplingDelay();
GPIO_ResetBits(GPIOC,si1); /* SI = 0 */
SamplingDelay();
SamplingDelay();
GPIO_ResetBits(GPIOC,clk1);
for(i=0; i<128; i++)
{
SamplingDelay();
GPIO_SetBits(GPIOC,clk1); /* CLK = 1 */
SamplingDelay();
SamplingDelay();
ad[i] = (u8)(ADC_Get_Value_1()>>4);
GPIO_ResetBits(GPIOC,clk1); /* CLK = 0 */
}
SamplingDelay();
GPIO_SetBits(GPIOC,clk1); /* CLK = 1 */
SamplingDelay();
GPIO_ResetBits(GPIOC,clk1); /* CLK = 0 */
ad_[42]=(ad[126]+ad[127])/2;
for(i=0;i<42;i++) //o?2¢????μ?
{
ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
}
max_ad =ad[0];
min_ad =ad[0];
for(i=0;i<42;i++)
{
if (ad_[i] > max_ad) max_ad =ad_[i];
if (ad_[i] < min_ad) min_ad =ad_[i];
}
fa = (max_ad + min_ad)*0.5;
// for(i=0;i<128;i++)
// { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
// else { ss2=ss2+ad[i];n2++; }
// }
// ss1=ss1/n1;
// ss2=ss2/n2;
// fa=(ss1+ss2)/2;
for(i=0;i<128;i++)
{ if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
else { ad[i]=0; }
}
for(i=0;i<43;i++)
{ if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
else ad_cl[i]=0;
}
}
void ccd_2()
{ char ss1=0,n1=0,ss2=0,n2=0;
GPIO_SetBits(GPIOA,si2); /* SI = 1 */
SamplingDelay();
GPIO_SetBits(GPIOA,clk2);
SamplingDelay();
GPIO_ResetBits(GPIOA,si2); /* SI = 0 */
SamplingDelay();
SamplingDelay();
GPIO_ResetBits(GPIOA,clk2);
for(i=0; i<128; i++)
{
SamplingDelay();
GPIO_SetBits(GPIOA,clk2); /* CLK = 1 */
SamplingDelay();
SamplingDelay();
ad[i] = (u8)(ADC_Get_Value_2()>>4);
GPIO_ResetBits(GPIOA,clk2); /* CLK = 0 */
}
SamplingDelay();
GPIO_SetBits(GPIOA,clk2); /* CLK = 1 */
SamplingDelay();
GPIO_ResetBits(GPIOA,clk2); /* CLK = 0 */
ad_[42]=(ad[126]+ad[127])/2;
for(i=0;i<42;i++) //o?2¢????μ?
{
ad_[i]=(ad[3*i]+ad[3*i+1]+ad[3*i+2])/3;
}
max_ad =ad[0];
min_ad =ad[0];
for(i=0;i<42;i++)
{
if (ad_[i] > max_ad) max_ad =ad_[i];
if (ad_[i] < min_ad) min_ad =ad_[i];
}
fa = (max_ad + min_ad)*0.5;
// for(i=0;i<128;i++)
// { if(ad[i] > fa){ ss1=ss1+ad[i];n1++;}
// else { ss2=ss2+ad[i];n2++; }
// }
// ss1=ss1/n1;
// ss2=ss2/n2;
// fa=(ss1+ss2)/2;
for(i=0;i<128;i++)
{ if(ad[i] > fa&&ad[i]-fa>fa*0.35){ ad[i]=1;}
else { ad[i]=0; }
}
for(i=0;i<43;i++)
{ if(ad_[i] > fa&&ad_[i]-fa>fa*0.35) ad_cl[i]=1;
else ad_cl[i]=0;
}
}