CH32V307多个触摸按键和普通ADC采样

可以提供一个CH32V307RCT6 的多个触摸按键的ADC 和 别的 ADC采样一起使用采集的例程吗?我这里不知道为啥总会有点问题,

不用这个

//    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))

//    ;

用和这个的话  

 if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0)

    {


    }

    else

    {

        TK2_Data = (uint16_t)TKey1->RDATAR;

    }

总有个ADC的值是错的




/*

 * Touch_SW.c

 *

 *  Created on: Nov 24, 2023

 *      Author: Administrator

 */



#include  "Touch_SW.h"

#include "UI_Display.h"

#include "OLED_Drv.h"


extern uint8_t Touch_ADC_Time_Flag;


uint8_t Touch_SW_Flag[2];

/*********************************************************************

 * @fn      Touch_Key_Init

 *

 * @brief   Initializes Touch Key collection.

 *

 * @return  none

 */

void Touch_Key_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure = {0};

    ADC_InitTypeDef  ADC_InitStructure = {0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div8);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//通道2

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//通道1

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);



    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;

    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 1;

    ADC_Init(ADC1, &ADC_InitStructure);


    ADC_Cmd(ADC1, ENABLE);

    TKey1->CTLR1 |= (1 << 26) | (1 << 24); // Enable TouchKey and Buffer\


    TKey1->CTLR1 |= 1 << 25;//电流减半

}



/*********************************************************************

 * @fn      Touch_Key_Adc

 *

 * @brief   Returns ADCx conversion result data.

 *

 * @param   ch - ADC channel.

 *            ADC_Channel_0 - ADC Channel0 selected.

 *            ADC_Channel_1 - ADC Channel1 selected.

 *            ADC_Channel_2 - ADC Channel2 selected.

 *            ADC_Channel_3 - ADC Channel3 selected.

 *            ADC_Channel_4 - ADC Channel4 selected.

 *            ADC_Channel_5 - ADC Channel5 selected.

 *            ADC_Channel_6 - ADC Channel6 selected.

 *            ADC_Channel_7 - ADC Channel7 selected.

 *            ADC_Channel_8 - ADC Channel8 selected.

 *            ADC_Channel_9 - ADC Channel9 selected.

 *            ADC_Channel_10 - ADC Channel10 selected.

 *            ADC_Channel_11 - ADC Channel11 selected.

 *            ADC_Channel_12 - ADC Channel12 selected.

 *            ADC_Channel_13 - ADC Channel13 selected.

 *            ADC_Channel_14 - ADC Channel14 selected.

 *            ADC_Channel_15 - ADC Channel15 selected.

 *            ADC_Channel_16 - ADC Channel16 selected.

 *            ADC_Channel_17 - ADC Channel17 selected.

 *

 * @return  val - The Data conversion value.

 */

u16 Touch_Key1_Adc(u8 KEY1ch)

{

    static   uint16_t TK_Data = 0;



    ADC_RegularChannelConfig(ADC1, KEY1ch, 1, ADC_SampleTime_7Cycles5);

    TKey1->IDATAR1 = 0x08; //Charging Time

    TKey1->RDATAR = 0x8;   //Discharging Time

//    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))

//    ;

    if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0)

   {


   }

   else

   {

       TK_Data =  (uint16_t)TKey1->RDATAR;

   }

    return TK_Data;

}



u16 Touch_Key2_Adc(u8 KEY2ch)

{


    static    uint16_t TK2_Data = 0;



    ADC_RegularChannelConfig(ADC1, KEY2ch, 1, ADC_SampleTime_7Cycles5);

    TKey1->IDATAR1 = 0x08; //Charging Time

    TKey1->RDATAR = 0x8;   //Discharging Time

//    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))

//    ;



    if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0)

    {


    }

    else

    {

        TK2_Data = (uint16_t)TKey1->RDATAR;

    }

    return TK2_Data;

}



//void Touch_Key_dataProcess(void)

//{

//    static uint16_t ADCData[2] = {0};

//

//

//    ADCData[0] = Touch_Key1_Adc(ADC_Channel_1);

//    ADCData[1] = Touch_Key2_Adc(ADC_Channel_2);

//

//

//

//}


void Touch_Key_Task(void)

{


    static uint16_t ADCData[2] = {0};

//    static uint16_t Last_Sta[2] = {0};


     ADCData[0] = Touch_Key1_Adc(ADC_Channel_1);

     ADCData[1] = Touch_Key2_Adc(ADC_Channel_2);

//     ADCData[1]=10000;

    if(Touch_ADC_Time_Flag != 0)

    {

        Touch_ADC_Time_Flag = 0;


        TFTLCD_Show5x7num(5,22,ADCData[0],GREED_COLOR,BACK_MAIN_COLOR);


        TFTLCD_Show5x7num(40,80,ADCData[1],GREED_COLOR,BACK_MAIN_COLOR);

    }

}


别的地方还用着一个通道10在采集着别的东西


image.png不支持ADC模块与触摸按键同时采样,触摸按键结束后,可以关闭TKENABLE 进行ADC采样。


不是同一个通道的也不可以同时采样吗?


不管是ADC通道还是触摸按键都不能一起采样,ADC模块只有一个,只是无法像ADC规则组通道配置最大16组可以扫描一个一个采样。触摸按键的寄存器都是映射了ADC模块的寄存器,而且只能配置为单通道单次采样,需要来回切ADC的初始化。


好的 ,这个我明白了。能再请教一下吗?就是比如说我两个触摸按键,两个不同的通道,比如说ch1 和 ch2 ,我也是得先获取了ch1 的触摸值 再 获取ch2的触摸值这样吗?还有就是我看到手册有touch——Key1 和 touch——Key2 这个是会有指定那个ADC的那些通道之类的吗? 没有看到这块的信息。


Touch-Key2,对应ADC2,对应配置就行。


好的 感谢 大佬的耐心解答


只有登录才能回复,可以选择微信账号登录