2016-07-04 08:20 AM
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 #!stm32f1032016-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