/*******************************************************************************
* File Name : adc.c
* Author :
* Date First Issued :
* Description :
********************************************************************************/
#ifndef _ADC_C
#define _ADC_C
#include "..\header\total_header.h"
void adc_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel10 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
/****************************************************************************************/
//¼ÆËãѹÁ¦
/****************************************************************************************/
short temp;
short Get_Pressure(void)
{
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); // µÈ´ýת»»Íê³É
temp = ADC_GetConversionValue(ADC1);
if(temp<50)
{
return 0;
}
else
{
return Pressure = (temp - 50)*5000/(4095 - 50);
}
}
uint32_t get_elapsed_time(uint32_t start_cnt1, uint32_t end_cnt1, uint32_t start_ovf1, uint32_t end_ovf1)
{
return (end_ovf1 - start_ovf1) * 65536 + (end_cnt1 - start_cnt1);
}
void Collect_Data(TAP_Data *data, uint16_t length,
uint32_t *max_rt, uint32_t *min_rt, uint32_t *avg_rt,
uint32_t *max_ht, uint32_t *min_ht, uint32_t *avg_ht,
uint16_t *max_p, uint16_t *min_p, uint16_t *avg_p,
uint16_t T)
{
uint32_t sum_rt = 0, sum_ht = 0;
uint32_t sum_p = 0;
*max_rt = *min_rt = data[0].return_time;
*max_ht = *min_ht = data[0].hit_time;
*max_p = *min_p = data[0].pressure;
for(int i = 0; i < length; i++)
{
if(data[i].return_time > *max_rt) *max_rt = data[i].return_time;
if(data[i].return_time < *min_rt) *min_rt = data[i].return_time;
sum_rt += data[i].return_time;
if(data[i].hit_time > *max_ht) *max_ht = data[i].hit_time;
if(data[i].hit_time < *min_ht) *min_ht = data[i].hit_time;
sum_ht += data[i].hit_time;
if(data[i].pressure > *max_p) *max_p = data[i].pressure;
if(data[i].pressure < *min_p) *min_p = data[i].pressure;
sum_p += data[i].pressure;
}
*avg_rt = sum_rt / length;
*avg_ht = sum_ht / length;
*avg_p = sum_p / length;
}
//TAP------->Time And Pressure
extern int X;
void Test_TAP(void)
{
int i;
timer3_init();
timer4_init();
for(i = 0;i<10;i++)
{
do {
start_ovf2 = overflow_count2;
start_cnt2 = TIM_GetCounter(TIM4);
} while (overflow_count2 != start_ovf2);
//---------------------------------------------------------------------
do {
start_ovf1 = overflow_count1;
start_cnt1 = TIM_GetCounter(TIM3);
} while (overflow_count1 != start_ovf1);
//-------------------¼ì²â´úÂëÔËÐÐʱ¼ä----------------------------------
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(Get_Pressure() == 0);//µÈ´ýѹÁ¦²»ÎªÁãΪֹ
//Delay_us(100);//µÈ´ýÖµÎȶ¨
//---------------------------------------------------------------------
do {
end_ovf1 = overflow_count1;
end_cnt1 = TIM_GetCounter(TIM3);
} while (overflow_count1 != end_ovf1);
elapsed_us1 = get_elapsed_time(start_cnt1, end_cnt1, start_ovf1, end_ovf1);
//---------------------------------------------------------------------
data_assemble[i].hit_time = elapsed_us1;//»ñÈ¡»÷´òʱ¼ä
Delay_ms(1000/frequency);
data_assemble[i].pressure = Get_Pressure();//»ñȡѹÁ¦Öµ
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Delay_ms(1000/frequency);
//---------------------------------------------------------------------
do {
end_ovf2 = overflow_count2;
end_cnt2 = TIM_GetCounter(TIM4);
} while (overflow_count2 != end_ovf2);
elapsed_us2 = get_elapsed_time(start_cnt2, end_cnt2, start_ovf2, end_ovf2);
data_assemble[i].return_time = elapsed_us2-elapsed_us1-200000/frequency+800;//»ñÈ¡»÷·µ»ØÊ±¼ä
}
// Collect_Data(arr1,&Max_ReturnTime,&Min_ReturnTime,&Average_ReturnTime,&RTW_Flag,8000);
// Collect_Data(arr2,&Max_HitTime,&Min_HitTime,&Average_HitTime,&HTW_Flag,8000);
// Collect_Data(arr3,&Max_Pressure,&Min_Pressure,&Average_Pressure,&PW_Flag,20000);
Collect_Data(tap_data, DATA_LENGTH,
&Max_ReturnTime, &Min_ReturnTime, &Average_ReturnTime,
&Max_HitTime, &Min_HitTime, &Average_HitTime,
&Max_Pressure, &Min_Pressure, &Average_Pressure,
8000);
RTW_Flag = (Average_ReturnTime > 8000) ? 1 : 0;
HTW_Flag = (Average_HitTime > 8000) ? 1 : 0;
PW_Flag = (Average_Pressure > 20000) ? 1 : 0;
X = frequency;
}
void Change_Frequency(void)
{
if (frequency > 0 && frequency <= 30)//¿ÉÉèÖÃ0~30µÄƵÂÊ
{
Test_TAP();
}
}
#endif
检查上述代码