本帖最后由 asun1388 于 2015-8-4 10:16 编辑
用片内AD做触摸用的。无故触摸屏不正常。发现AD引脚有3v电压(在不借触摸屏的情况下)。把它设置为输出,拉高拉低很正常。设置为下拉输入,也有2.9V左右电压。
求大神指点一下。
补充下:
用的是stm32f407啦
屏用的是武汉中显的8寸屏,16位的。
挂的是ucos-ii系统,用的是emwin界面。
下面是程序一部分/*****************************************************************************
函 数 名 : Inter_AD_Init
功能描述 : 内部ADC初始化触摸屏电压转换
输入参数 : void
输出参数 : 无
返 回 值 : 无
*****************************************************************************//*****************************************************************************
函 数 名 : Inter_AD_Init
功能描述 : 内部ADC初始化触摸屏电压转换
输入参数 : void
输出参数 : 无
返 回 值 : static
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2015年6月24日
作 者 : ZQ
修改内容 : 新生成函数
*****************************************************************************/
static void Inter_AD_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
/* Enable ADC1, DMA2 and GPIO clocks ****************************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC2通道时钟
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作在独立模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8; //时钟21MHz
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //不使用DMA模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles; //两次采样间隔5周期
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC2 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //ADC 12位
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能ADC1
// ADC_SoftwareStartConv(ADC1);
// ADC_ResetCalibration(ADC1); //使能复位校准
// while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
}
下面四个函数是被emwin调用,用来查询触摸的。
/*****************************************************************************
函 数 名 : GUI_TOUCH_X_ActivateX
功能描述 : 触摸初始化AD及相关引脚,被emwin调用
输入参数 : void
输出参数 : 无
返 回 值 : 无
*****************************************************************************/
void GUI_TOUCH_X_ActivateX(void)//GUI_TOUCH_X_ActivateX
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //ydown(PC2)拉低
GPIO_SetBits(GPIOA, GPIO_Pin_2); //yup(PC0)拉高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //X右(PC3)接ADC 上至下 递减
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_15Cycles );//ADC1,ADC通道13,规则采样顺序值为1,采样时间为3周期
}
/*****************************************************************************
函 数 名 : GUI_TOUCH_X_MeasureX
功能描述 : 查询电压值,被emwin调用
输入参数 : void
输出参数 : 无
返 回 值 : 无
*****************************************************************************/
int GUI_TOUCH_X_MeasureX(void)
{
uint8_t i;
uint16_t Temp=0;
for(i=0; i<8; i++)
{
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
Temp+=ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
Temp>>=3;
return (Temp);
}
/*****************************************************************************
函 数 名 : GUI_TOUCH_X_ActivateY
功能描述 : 触摸初始化AD及相关引脚,被emwin调用
输入参数 : void
输出参数 : 无
返 回 值 : 无
*****************************************************************************/
void GUI_TOUCH_X_ActivateY(void) //GUI_TOUCH_X_ActivateY
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //ydown(PC2)拉低
GPIO_SetBits(GPIOA, GPIO_Pin_3); //yup(PC0)拉高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //X右(PC3)接ADC 上至下 递减
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles );//ADC1,ADC通道13,规则采样顺序值为1,采样时间为3周期
}
/*****************************************************************************
函 数 名 : GUI_TOUCH_X_MeasureY
功能描述 : 查询电压值,被emwin调用
输入参数 : void
输出参数 : 无
返 回 值 : 无
*****************************************************************************/
int GUI_TOUCH_X_MeasureY(void)
{
uint8_t i;
uint16_t Temp=0;
for(i=0; i<8; i++)
{
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
Temp+=ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
Temp>>=3;
return (Temp);
}
添加代码老是出现毛病,就这样吧。
|