#include "adc.h" #include "ctrl.h" #include "task.h" //初始化AD //#ifdef _DEBUG double Result[3]; //#endif #define M 2 vu16 AD_Value[M]; u16 ADStove[MAX_STOVE_CNT]={0}; u16 ADPool[MAX_POL_CNT]={0}; // //double ADStoveSpeedSum = 0.0f; //升温速度微分累加 long ADStovePtr= 0; long ADPoolPtr= 0 ; void InitAD(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_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 = M; //DMA通道的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_Mode_Normal;//DMA_Mode_Circular; //工作在循环缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道 DMA_ITConfig(DMA1_Channel1 ,DMA_IT_TC,ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道 ///////////////////////////////////////// /* Enable DMA2 channel6 IRQ Channel */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ///////////////////////////////////////// //APB2 ADC 时钟不能太快 APB2设置为 CLK/8 ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值 //RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC时钟分频 //adc clock 9MHz RCC_ADCCLKConfig(RCC_PCLK2_Div2); //配置ADC时钟分频 2015.12.26加速一倍,将2.2uF电容拆除 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 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_InitStructure.ADC_NbrOfChannel = M; ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_71Cycles5); //252 个周期 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5); //ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5); //原设置 72M PCLK1 1分频 ADC 4分频 ADC_SampleTime_239Cycles5 //新改设置 ADC 7MHz 5000次平均 ADC_SampleTime_239Cycles5 //60mS 抵抗工频干扰 1个71.5 还有一个239.5 60ms 1250倍 //将控温周期修改为1S // ADStovePtr = 0; // ADSTOVE_ADS1242 = 0; // PE15_O = 1; //小电极打开 //转换时间 1.5 //7.5 ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ///////////////////////////////////////// ADC_DMACmd(ADC1,ENABLE); ADC_SoftwareStartConvCmd(ADC1,ENABLE); } //AD读取任务 double ADToVol(int iADValue) { double i = VREF>>3; i*=iADValue; i/=0xFFFFFF; return i; } volatile unsigned char Int0IntFlag = 0; volatile unsigned char gcChannel = 0; volatile unsigned char count = 0; long lPreTemp,lTemp,ADStoveSpeedSum2; long deltaTempErr; //long lPreAD,lCurAD; void DMA1_Channel1_IRQHandler(void) { int tempValue = 0; DMA_ClearITPendingBit(DMA1_IT_TC1); //update Temperature value disable(); lPreTemp = lTemp ; lTemp -= ADStove[ADStovePtr]; deltaTempErr = (long)AD_Value[1] - (long)ADStove[ADStovePtr]; ADStove[ADStovePtr] = AD_Value[1]; lTemp += ADStove[ADStovePtr]; ADStovePtr = (++ADStovePtr)%MAX_STOVE_CNT; // lTemp -= ((double)lTemp)/MAX_STOVE_CNT; 扣减平均值滞后比较厉害 // lTemp += AD_Value[1]; //warn speed sum........ //主板拆除了2.2uF滤波电容两个 //ADStoveSpeedSum -= ADStoveSpeedSum/ADStoveSpeedDepth ; //ADStoveSpeedSum += (lTemp- lPreTemp);//(lCurAD - lPreAD); //ADStoveSpeedSum2 = ADStoveSpeedSum; //update temperature IED.AdValue.lPreTemp = IED.AdValue.lTemp; IED.AdValue.lTemp = lTemp; //if(labs(deltaTempErr)>0x2) //未调试 // IED.AdValue.lTemp += deltaTempErr*MAX_STOVE_CNT/20; //加上微分值.增加响应速度 //update sensor value IED.AdValue.lPreChlPol = IED.AdValue.lChlPol ; IED.AdValue.lChlPol -= ADPool[ADPoolPtr]; ADPool[ADPoolPtr] = AD_Value[0]; IED.AdValue.lChlPol += ADPool[ADPoolPtr]; ADPoolPtr=(++ADPoolPtr)%MAX_POL_CNT; enable(); //大电极电压............ //IED.AdValue.lPreChlVDJ = IED.AdValue.lVDJ ; //IED.AdValue.lVDJ = AD_Value[2]; /////////////// //#ifdef _DEBUG Result[0] = GetTempVol(); Result[1] = GetPolVol(); Result[2] = GetPolVol2(); //printf("%fmV,%fmV,%fmV\n",dResult[0],dResult[1],dResult[2]); //#endif } double GetTempVol(void) { double dResult; dResult = IED.AdValue.lTemp ; dResult*=VREF; dResult/=0xFFF; dResult/=GAIN_TEMP; dResult/=MAX_STOVE_CNT; return dResult; } double GetPolVol(void) { double dResult; dResult = IED.AdValue.lPreChlPol ; dResult*=VREF; dResult/=0xFFFL; dResult/=GAIN_POL; dResult/=MAX_POL_CNT; return dResult ; } double GetPolVol2(void) { double dResult; dResult = AD_Value[0]; dResult*=VREF; dResult/=0xFFFL; dResult/=GAIN_POL; return dResult ; } double GetDJVol(void) { double dResult; dResult = IED.AdValue.lVDJ ; dResult*=VREF; dResult/=0xFFF; return dResult/GAIN_DJ ; }