2016-07-04 08:20 AM - last edited on 2025-01-11 07:38 AM by Andrew Neil
Posted on July 04, 2016 at 17:20
I've an STM32F103 MCU and a 4-wire resistive touch. this is the circuit I've wired up:
http://i.stack.imgur.com/QFRU3.jpg I've written this code:
#include ''stm32f10x.h'' #include ''ili9h'' #include ''stdio.h'' #define SYSCLK_FREQ_72MHz uint8_t A = 3,L; uint16_t read = 0; char str[15]; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* Private functions ---------------------------------------------------------*/ void Pins( void ); void _ADC1( void ); void ReadScaleX( void ); /******************************************************************************* * Function Name : main * Description : Main Programme * Input : None * Output : None * Return : None * Attention : None *******************************************************************************/ int main( void ) { /* Initialize the LCD */ ili9320_Initializtion(); /* Clear the LCD */ ili9320_Clear(Yellow); Pins(); _ADC1(); SysTick_Config(SystemCoreClock/100); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); /* Infinite loop */ while (1) { if (L){ ReadScaleX(); sprintf (str, ''%d'' , read ); ili9320_DisplayStringLine(Line0,(u8 *)str,White,Blue); read = 0; L = 0; } } } void Pins( void ){ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE ); //ADC channels GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOC , &GPIO_InitStructure ); } void _ADC1( void ) { RCC_ADCCLKConfig(RCC_PCLK2_Div2); /* Enable ADC1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); /* ADC1 configuration ------------------------------------------------------*/ 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 = 2; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10 , 1, ADC_SampleTime_28Cycles5); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)){}; ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)){}; /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); } void ReadScaleX( void ){ uint8_t i = 0; /* Changes the pins config PC0 = +X PC2 = -X PC1 = +Y PC3 = -Y */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_SetBits( GPIOC , GPIO_Pin_1 ); ADC_RegularChannelConfig(ADC1, 10 , 1, ADC_SampleTime_28Cycles5); for ( i=0 ; i<5 ; ++i ){ /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus( ADC1 , ADC_FLAG_EOC ) == RESET){}; read += ADC_GetConversionValue(ADC1); } read = ((uint32_t)(read*48))/4095; }
Everything is working very well save one part! the ADC input! it sounds like the ADC goes crazy! I just get wrong value. either I push the screen or I don't push, it gives me a wrong value. I debugged the program and I found out the ADC's input gives wrong value. I think the problem is in the configuration of GPIOs. I mean this part:
/* Changes the pins config PC0 = +X PC2 = -X PC1 = +Y PC3 = -Y */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init( GPIOC , &GPIO_InitStructure ); GPIO_SetBits( GPIOC , GPIO_Pin_1 );
For ADC input(PC0) I configured it as
GPIO_Mode_AIN
( analog input) that I think it's correct but I doubt about other parts. in this function I just want to read the X axis then I configured PC1(+Y) as output push-pull and PC3(-Y) input pull-down and PC2(-X) as input floating. are they correct?
I got the idea from
. What do you think?
Edit: or maybe the problem is the ADC because even when I don't touch the screen, it gives me some strange value. shouldn't it give me 0 at input?
I've asked the question here though: http://electronics.stackexchange.com/questions/244303/the-4-wire-resistive-touch-is-connected-to-the-adcs-input-but-it-doesnt-give-c #touch #adc #!stm32f103
2016-07-04 08:39 AM
ADC_InitStructure.ADC_NbrOfChannel = 2;
// Yet you only use/program ONE
2016-07-04 08:51 AM
Hi Clive
Changed it to 1 but didn't work.2016-07-04 09:20 AM
Edit2: I added this line
ili9320_DisplayStringLine(Line0,(u8 *)''000'',White,Blue);
within the main while and now it's a little better. just changing between 1 to 9. I did two simple test. I connected +X to the GND and it showed me just 0. and gain I connected +Y to 3v3 and it showed me between 169 to 200 on the LCD depond on where I pushed the LCD.
2016-07-05 01:01 PM
Number of conversions = 1 is correct. You are converting one axis, then (later code) reconfiguring digital and analog pins to read the other axis.
Reset PC3 to GND, then wait a while for the voltages to settle before the ADC readings. Temporarily insert a debug halt after setting the voltages, then read the signal voltage with a VO meter as you press the pad. If the results show a good signal, increase the ADC sampling cycles. Cheers, Hal