[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]
|