DMA_DeInit(DMA1_Channel1); //DMA配置
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址//(u32)&ADC1->DR//ADC1_DR_Address
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 16;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址固定
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);
extern float ADC_ConvertedValue[8][2]; //filter.c中进行外部声明
void AD_filter(void) //该函数对ADC_ConvertedValue[8][2]进行滤波
{
char mm;
for(mm=0;mm<8;mm++)
{
result_chan0+=ADC_ConvertedValue[mm][0];
result_chan1+=ADC_ConvertedValue[mm][1];
// result_chan2+=maopao_2_data[mm];
}
result_chan0/=8; //AN0 即result_chan0/=8
result_chan1/=8; //AN1
if(result_chan0>=0xfff)result_chan0=0xfff;
if(result_chan1>=0xfff)result_chan0=0xfff;
}
extern float result_chan0,result_chan1; //知道函数中调用数据平均值
void TIM2_IRQHandler(void) //中断函数
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
tim2_add++;
if (tim2_add>=30)
{
tim2_add=0;
A++;
AD_filter();
ADIN_Data =(result_chan0/4096)*3.314*10; //不知道是不是这里的问题
buck_VI =(result_chan1/4096)*3.314*10;
buck_VO=ADIN_Data;
buck_PID();
}
if(A>=100)GPIO_ResetBits(GPIOB,GPIO_Pin_9);
if(A>=200){GPIO_SetBits(GPIOB,GPIO_Pin_9);A=0;} //小灯闪烁正常
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}
printf("%f\n",buck_VI); //这句位于主函数,串口有返回值,返回值都是0.0000 在没加滤波void AD_filter(void)之前返回过正常值,说明AD检测没有问题,串口有返回值说明串口没问题,小灯闪烁说明进入了中断函数。