我在使用C573開(kāi)發(fā)板測(cè)試觸摸的時(shí)候發(fā)現(xiàn)沒(méi)有數(shù)值變化,我采用的是官方例程。
這里面應(yīng)該是?/* TouchKey采樣:選擇adc通道 2 做采樣,對(duì)應(yīng) PA12 */開(kāi)發(fā)板連接PA12,我下載到開(kāi)發(fā)板后用手觸摸PA12。一直顯示4095.不知道什么原因。
/********************************** (C) COPYRIGHT *******************************
?* File Name? ? ? ? ? : Main.c
?* Author? ? ? ? ? ? ?: WCH
?* Version? ? ? ? ? ? : V1.0
?* Date? ? ? ? ? ? ? ?: 2021/03/09
?* Description? ? ? ? : adc采樣示例,包括溫度檢測(cè)、單通道檢測(cè)、差分通道檢測(cè)、TouchKey檢測(cè)、中斷方式采樣。
?* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
?* SPDX-License-Identifier: Apache-2.0
?*******************************************************************************/
#include "CH57x_common.h"
uint16_t abcBuff[40];
volatile uint8_t adclen;
volatile uint8_t DMA_end = 0;
/*********************************************************************
?* @fn? ? ? DebugInit
?*
?* @brief? ?調(diào)試初始化
?*
?* @return? none
?*/
void DebugInit(void) {
? ? GPIOA_SetBits(GPIO_Pin_9);
? ? GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
? ? GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
? ? UART1_DefInit();
}
/*********************************************************************
?* @fn? ? ? main
?*
?* @brief? ?主函數(shù)
?*
?* @return? none
?*/
int main() {
? ? uint8_t i;
? ? signed short RoughCalib_Value = 0; // ADC粗調(diào)偏差值
? ? SetSysClock(CLK_SOURCE_PLL_60MHz);
? ? /* 配置串口調(diào)試 */
? ? DebugInit();
? ? PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
? ? /* 溫度采樣并輸出, 包含數(shù)據(jù)校準(zhǔn) */
? ? PRINT("\n1.Temperature sampling...\n");
? ? ADC_InterTSSampInit();
? ? RoughCalib_Value = ADC_DataCalib_Rough(); // 用于計(jì)算ADC內(nèi)部偏差,記錄到變量 RoughCalib_Value中,注意這個(gè)變量需要定義為有符號(hào)變量
? ? for (i = 0; i < 20; i++) {
? ? ? ? abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 連續(xù)采樣20次
? ? }
? ? for (i = 0; i < 20; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? }
? ? /* 單通道采樣:選擇adc通道0做采樣,對(duì)應(yīng) PA4引腳, 帶數(shù)據(jù)校準(zhǔn)功能 */
? ? PRINT("\n2.Single channel sampling...\n");
? ? GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);
? ? ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
? ? RoughCalib_Value = ADC_DataCalib_Rough(); // 用于計(jì)算ADC內(nèi)部偏差,記錄到全局變量 RoughCalib_Value中
? ? PRINT("RoughCalib_Value =%d \n", RoughCalib_Value);
? ? ADC_ChannelCfg(0);
? ? for (i = 0; i < 20; i++) {
? ? ? ? abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 連續(xù)采樣20次
? ? }
? ? for (i = 0; i < 20; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]); // 注意:由于ADC內(nèi)部偏差的存在,當(dāng)采樣電壓在所選增益范圍極限附近的時(shí)候,可能會(huì)出現(xiàn)數(shù)據(jù)溢出的現(xiàn)象
? ? }
? ? /* DMA單通道采樣:選擇adc通道0做采樣,對(duì)應(yīng) PA4引腳 */
? ? GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);
? ? ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
? ? ADC_ChannelCfg(0);
? ? ADC_AutoConverCycle(192); // 采樣周期為 (256-192)*16個(gè)系統(tǒng)時(shí)鐘
? ? ADC_DMACfg(ENABLE, (uint16_t) (uint32_t) &abcBuff[0],
? ? ? ? ? ? (uint16_t) (uint32_t) &abcBuff[40], ADC_Mode_Single);
? ? PFIC_EnableIRQ(ADC_IRQn);
? ? ADC_StartDMA();
? ? while(!DMA_end);
? ? DMA_end = 0;
? ? PRINT("ADC DMA end \n");
? ? for (i = 0; i < 40; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? }
? ? /* 差分通道采樣:選擇adc通道0做采樣,對(duì)應(yīng) PA4(AIN0)、PA12(AIN2) */
? ? PRINT("\n3.Diff channel sampling...\n");
? ? GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_12, GPIO_ModeIN_Floating);
? ? ADC_ExtDiffChSampInit(SampleFreq_3_2, ADC_PGA_0);
? ? ADC_ChannelCfg(0);
? ? for (i = 0; i < 20; i++) {
? ? ? ? abcBuff[i] = ADC_ExcutSingleConver(); // 連續(xù)采樣20次
? ? }
? ? for (i = 0; i < 20; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? }
? ? /* TouchKey采樣:選擇adc通道 2 做采樣,對(duì)應(yīng) PA12 */
? ? PRINT("\n4.TouchKey sampling...\n");
? ? GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
? ? TouchKey_ChSampInit();
? ? ADC_ChannelCfg(2);
? ? for (i = 0; i < 20; i++) {
? ? ? ? abcBuff[i] = TouchKey_ExcutSingleConver(0x10, 0); // 連續(xù)采樣20次
? ? }
? ? for (i = 0; i < 20; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? }
? ? /* 單通道采樣:中斷方式,選擇adc通道1做采樣,對(duì)應(yīng) PA5引腳, 不帶數(shù)據(jù)校準(zhǔn)功能 */
? ? PRINT("\n5.Single channel sampling in interrupt mode...\n");
? ? GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);
? ? ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
? ? ADC_ChannelCfg(1);
? ? adclen = 0;
? ? ADC_ClearITFlag();
? ? PFIC_EnableIRQ(ADC_IRQn);
? ? ADC_StartUp();
? ? while(adclen < 20);
? ? PFIC_DisableIRQ(ADC_IRQn);
? ? for (i = 0; i < 20; i++) {
? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? }
? ? while(1) {
? ? ? ? /* TouchKey采樣:選擇adc通道 2 做采樣,對(duì)應(yīng) PA12 */
? ? ? ? PRINT("\n4.觸摸采樣...\n");
? ? ? ? GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
? ? ? ? TouchKey_ChSampInit();
? ? ? ? ADC_ChannelCfg(2);
? ? ? ? for(i = 0; i < 20; i++)
? ? ? ? {
? ? ? ? ? ? abcBuff[i] = TouchKey_ExcutSingleConver(0x10, 0); // 連續(xù)采樣20次
? ? ? ? }
? ? ? ? for(i = 0; i < 20; i++)
? ? ? ? {
? ? ? ? ? ? PRINT("%d \n", abcBuff[i]);
? ? ? ? }
? ? ? ? DelayMs(1000);
? ? }
}
/*********************************************************************
?* @fn? ? ? ADC_IRQHandler
?*
?* @brief? ?ADC中斷函數(shù)
?*
?* @return? none
?*/
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void ADC_IRQHandler(void) {
? ? if (ADC_GetDMAStatus()) {
? ? ? ? ADC_ClearDMAFlag();
? ? ? ? ADC_StopDMA();
? ? ? ? R16_ADC_DMA_BEG = (uint16_t) (uint32_t) &abcBuff[0];
? ? ? ? DMA_end = 1;
? ? }
? ? if (ADC_GetITStatus()) {
? ? ? ? ADC_ClearITFlag();
? ? ? ? if (adclen < 20) {
? ? ? ? ? ? abcBuff[adclen] = ADC_ReadConverValue();
? ? ? ? ? ? ADC_StartUp(); // 作用清除中斷標(biāo)志并開(kāi)啟新一輪采樣
? ? ? ? }
? ? ? ? adclen++;
? ? }
}