完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在使用C573开发板测试触摸的时候发现没有数值变化,我采用的是官方例程。
这里面应该是 /* TouchKey采样:选择adc通道 2 做采样,对应 PA12 */开发板连接PA12,我下载到开发板后用手触摸PA12。一直显示4095.不知道什么原因。 /********************************** (C) COPYRIGHT ******************************* * File Name : Main.c * Author : WCH * Version : V1.0 * Date : 2021/03/09 * Description : adc采样示例,包括温度检测、单通道检测、差分通道检测、TouchKey检测、中断方式采样。 * 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 调试初始化 * * @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 主函数 * * @return none */ int main() { uint8_t i; signed short RoughCalib_Value = 0; // ADC粗调偏差值 SetSysClock(CLK_SOURCE_PLL_60MHz); /* 配置串口调试 */ DebugInit(); PRINT("Start @ChipID=%02X ", R8_CHIP_ID); /* 温度采样并输出, 包含数据校准 */ PRINT(" 1.Temperature sampling... "); ADC_InterTSSampInit(); RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量 for (i = 0; i < 20; i++) { abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次 } for (i = 0; i < 20; i++) { PRINT("%d ", abcBuff); } /* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */ PRINT(" 2.Single channel sampling... "); GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating); ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中 PRINT("RoughCalib_Value =%d ", RoughCalib_Value); ADC_ChannelCfg(0); for (i = 0; i < 20; i++) { abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次 } for (i = 0; i < 20; i++) { PRINT("%d ", abcBuff); // 注意:由于ADC内部偏差的存在,当采样电压在所选增益范围极限附近的时候,可能会出现数据溢出的现象 } /* DMA单通道采样:选择adc通道0做采样,对应 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个系统时钟 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 "); for (i = 0; i < 40; i++) { PRINT("%d ", abcBuff); } /* 差分通道采样:选择adc通道0做采样,对应 PA4(AIN0)、PA12(AIN2) */ PRINT(" 3.Diff channel sampling... "); 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 = ADC_ExcutSingleConver(); // 连续采样20次 } for (i = 0; i < 20; i++) { PRINT("%d ", abcBuff); } /* TouchKey采样:选择adc通道 2 做采样,对应 PA12 */ PRINT(" 4.TouchKey sampling... "); GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); TouchKey_ChSampInit(); ADC_ChannelCfg(2); for (i = 0; i < 20; i++) { abcBuff = TouchKey_ExcutSingleConver(0x10, 0); // 连续采样20次 } for (i = 0; i < 20; i++) { PRINT("%d ", abcBuff); } /* 单通道采样:中断方式,选择adc通道1做采样,对应 PA5引脚, 不带数据校准功能 */ PRINT(" 5.Single channel sampling in interrupt mode... "); 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 ", abcBuff); } while(1) { /* TouchKey采样:选择adc通道 2 做采样,对应 PA12 */ PRINT(" 4.触摸采样... "); GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); TouchKey_ChSampInit(); ADC_ChannelCfg(2); for(i = 0; i < 20; i++) { abcBuff = TouchKey_ExcutSingleConver(0x10, 0); // 连续采样20次 } for(i = 0; i < 20; i++) { PRINT("%d ", abcBuff); } DelayMs(1000); } } /********************************************************************* * @fn ADC_IRQHandler * * @brief ADC中断函数 * * @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(); // 作用清除中断标志并开启新一轮采样 } adclen++; } } |
|
相关推荐
1个回答
|
|
你这边是怎么去操作的呢,有接触摸板嘛
|
|
|
|
只有小组成员才能发言,加入小组>>
477 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2874 浏览 2 评论
2361 浏览 1 评论
819浏览 2评论
CH569通过HSPI实现USB3.0和FPGA高速双向通讯
646浏览 1评论
500浏览 1评论
CH32F103C8T6使用当前官网上的CDC例程会出现设备描述符请求失败
365浏览 1评论
642浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 04:11 , Processed in 1.037629 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号