七步走,
第一步:给CS放电,S3开,
第二步:所有开关关闭,
第三步:S2开启,给CX充电。
第四步:所有开关关闭
第五步:开启S1给CS充电
第六步:所有开关关闭
第七步:S1和S3开启,给CX和CS放电
重复上面的7个步骤,直到CS电压到高电平(有触摸时重复次数将减少)
在第六步后采集到I/0端口电平是否超过阀值。
void Configure_TSC(void)
{
RCC->AHBENR |= RCC_AHBENR_TSEN;
TSC->CR = TSC_CR_PGPSC_2 | TSC_CR_PGPSC_0 // fPGCLK = fHCLK/32
| TSC_CR_CTPH_0 | TSC_CR_CTPL_0 // pulse high = 2xtPGCLK,Master
| TSC_CR_MCV_2 | TSC_CR_MCV_1 // Max count value = 16383 pulses
| TSC_CR_TSCE; // Enable TSC
TSC->IOHCR &= (uint32_t)(~(TSC_IOHCR_G2_IO4 | TSC_IOHCR_G2_IO3)); // 默认使能,去除不要的端口
TSC->IER = TSC_IER_EOAIE; // 转换系列结束中断
TSC->IOSCR = TSC_IOSCR_G2_IO4; // 采样端口电容接在 G2IO4上
TSC->IOCCR = TSC_IOCCR_G2_IO3; // 触摸按键设在G2IO3上
TSC->IOGCSR |= TSC_IOGCSR_G2E; // 使能组2
NVIC_SetPriority(TSC_IRQn, 0);
NVIC_EnableIRQ(TSC_IRQn);
}
void TSC_IRQHandler(void)
{
if((TSC->ISR & TSC_ISR_EOAF) == TSC_ISR_EOAF) //系列结束否
{
TSC->ICR = TSC_ICR_EOAIC; /* Clear flag */
AcquisitionValue = TSC->IOGXCR[1]; /* Get G2 counter value */
}
}
void Process(void)
{
static uint32 NumberOfCalibration=0;
uchar RefIndex=0;
static uchar RefIndexStatic=0;
static uint32 ReferenceTab[REFERENCE_TAB_SIZE];
if(AcquisitionValue) //有数据到来
{
if(CalibrationDone) //是否矫正完成
{
if((AcquisitionValue + THRESHOLD) < Reference) /* Touch detected */
{
Activities = 1;
}
else if(AcquisitionValue > (Reference + THRESHOLD))
{
Activities = 1;
CalibrationDone = 0; /* restart calibration */
Reference = 0; /* Reset reference */
}
else /* no touch detected */
{
if(ReferenceAdaptation)
{
ReferenceAdaptation=0;
RefIndexStatic%=REFERENCE_TAB_SIZE;
ReferenceTab[RefIndexStatic++] = AcquisitionValue;
for(RefIndex=0;RefIndex<REFERENCE_TAB_SIZE;RefIndex++)
{
Reference += ReferenceTab[RefIndex];
}
Reference /= (REFERENCE_TAB_SIZE + 1);
}
}
}
else /* Calibration */
{
if(NumberOfCalibration < NUMBER_OF_CALIBRATION)
{
Reference += AcquisitionValue;
NumberOfCalibration++;
}
else if(NumberOfCalibration == NUMBER_OF_CALIBRATION)
{
Reference += AcquisitionValue;
Reference /= (NUMBER_OF_CALIBRATION + 1); /* Compute reference */
NumberOfCalibration = 0; /* Reset number of calibration for nex time */
CalibrationDone = 1; /* Calibration Completed */
for(RefIndex=0;RefIndex<REFERENCE_TAB_SIZE;RefIndex++)
{
ReferenceTab[RefIndex] = Reference;
}
}
}
AcquisitionValue = 0; //复位count值
TSC->CR |= (1<<1) ; // 开始新的系列
}
}
void main()
{
Configure_TSC();
TSC->CR |= (1<<1); // 开始转换
while(1)
{
Process();
}
}
|