是不因为 我计算的时候时间安排得不对,部分程序:
AD初使化: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC3工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式(多通道) ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单次模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 11; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStructure中指定的参数初始化外设ADC1的寄存器 //设置指定ADC的规则组通道,设置它们的转化顺序(与原理图上的AI序号一致)和采样时间(取最大值) ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_41Cycles5);//AI10,PA1,Pin35 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_41Cycles5);//AI11,PA2,Pin36 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_41Cycles5);//AI12,PA3,Pin37 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_41Cycles5);//AI13,PA4,Pin40 ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_41Cycles5);//AI14,PA5,Pin41 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_41Cycles5);//AI15,PA6,Pin42 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 7, ADC_SampleTime_41Cycles5);//AI16,PA7,Pin43 ADC_RegularChannelConfig(ADC1, ADC_Channel_14,8, ADC_SampleTime_41Cycles5);//AI17,PC4,Pin44 ADC_RegularChannelConfig(ADC1, ADC_Channel_15,9, ADC_SampleTime_41Cycles5);//AI18,PC5,Pin45 ADC_RegularChannelConfig(ADC1, ADC_Channel_8,10, ADC_SampleTime_41Cycles5);//AI19,PB0,Pin46 ADC_RegularChannelConfig(ADC1, ADC_Channel_9,11, ADC_SampleTime_41Cycles5);//AI20,PB1,Pin47 ADC_DMACmd(ADC1, ENABLE); //使能ADC1的DMA请求
ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态并等待其值变为0(校准寄存器已初始化)
ADC_StartCalibration(ADC1); //开始ADC1的校准状态 while(ADC_GetCalibrationStatus(ADC1));//获取ADC校准寄存器的状态并等待其值变为0(已完成校准)
DMA: DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&iADC1_ConvertedValueTab;
TIM1,定时156.25us:
if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//如果发生TIM2捕获比较中断 { TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除TIM2捕获比较中断待处理位 iADTimesCnt++; iADStep++; iFlashPeriod=100; if(++iFlashCnt>=iFlashPeriod) iFlashCnt=0; if(iFlashCnt<50) VOL_LOW; if(iFlashCnt>49) VOL_HIG ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动功能 }
ADC处理: if(iADTimesCnt>=128); { iADTimesCnt=0; for(c=0;c<11;c++) { for(n=0;n<128;n++)iADC1_SquareValue[n][c]=pow(iADC1_ConvertedValueTab[n][c],2); //保存每通道电压的平方值 iADC1_SumSquareValue[c]=0; for(n=0;n<128;n++)iADC1_SumSquareValue[c]+=iADC1_SquareValue[n][c];//保存每通道平方和 iADC1_SumSquareValue[c]=(iADC1_SumSquareValue[c]>>7);//保存每通道平方和的平均值 iADC1_ValueResult[c]=sqrt(iADC1_SumSquareValue[c]);//保存每通道的有效值 iADC1_ValueResult[c]=((iADC1_ValueResult[c]*3300)>>12);//单位为mV,保存实际电压值 Volt1[c]=(u16)iADC1_ValueResult[c]; } }
main:
int main(void) { u8 c; IWDG_Configuration(); RCC_Configuration(); //配置各系统时钟 GPIO_Configuration(); //配置各GPIO接口 NVIC_Configuration(); //配置嵌套中断向量列表控制器以及中断向量表基地址 USART1_Configuration(); TIM2_Configuration(); //定时器TIM2初始化为定时模式 TIM1_Configuration(); //定时器TIM1初始化为定时模式
data_init(); //数据初始化 dalay(); //开机延时
DMA2_Configuration(); //DMA2初使化 DMA1_Configuration(); //DMA1初使化 ADC_Configuration(); //ADC初使化 EXTI_Configuration(); //配置外部中断/事件控制器 // ADC_DataHandle();
while(1) { dalay(); ADC_DataHandle(); for(c=0;c<11;c++) { USART_SendData(USART1,Volt1[c]/1000); //发电压高位 //注意,USART_SendData函数不检查是否发送完成 //等待发送完成 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1,Volt1[c]%1000); // 发电压低位 //注意,USART_SendData函数不检查是否发送完成 //等待发送完成 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } }
}
|
|