打印
[STM32F4]

stm32f407 AD引脚被拉高。

[复制链接]
2482|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asun1388|  楼主 | 2015-8-3 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
}

添加代码老是出现毛病,就这样吧。








UCOS_EMWIN.rar

2.51 MB

简单调试程序

中显8寸1616.pdf

499.36 KB

屏的资料

沙发
Leeone| | 2015-8-3 09:34 | 只看该作者
屏拿了 空载和接个电位器调调是不是正常

使用特权

评论回复
板凳
asun1388|  楼主 | 2015-8-3 10:39 | 只看该作者
Leeone 发表于 2015-8-3 09:34
屏拿了 空载和接个电位器调调是不是正常

屏拿了,AD引脚接电位器AD正常。
屏直接接电压,然后测试触摸,正常的。
合在一起就不行了。

使用特权

评论回复
地板
amanda_s| | 2015-8-3 11:27 | 只看该作者
合在一起什么意思?
就是屏也连在板子上,但是不接到这个IO口上?

使用特权

评论回复
5
asun1388|  楼主 | 2015-8-3 11:36 | 只看该作者
我的意思是,触摸屏单独是好的;
片内ad测试电位器也正常;
然后把触摸屏直接接到片内ad上,就不正常了。

使用特权

评论回复
6
Sunny左瞳| | 2015-8-3 15:09 | 只看该作者
asun1388 发表于 2015-8-3 11:36
我的意思是,触摸屏单独是好的;
片内ad测试电位器也正常;
然后把触摸屏直接接到片内ad上,就不正常了。

遇到过类似情况。不过你描述的很模糊了。我以前是屏负载大。芯片驱动能力不够。外接电路,AD 做检测用

使用特权

评论回复
7
asun1388|  楼主 | 2015-8-3 15:38 | 只看该作者
Sunny左瞳 发表于 2015-8-3 15:09
遇到过类似情况。不过你描述的很模糊了。我以前是屏负载大。芯片驱动能力不够。外接电路,AD 做检测用 ...

怎么说呢,就是买的屏不带触摸芯片,然后使用用片内AD去做触摸。
本来运行的好好的,然后重烧一次程序改动很少的那种,就忽然不正常了。
更换s新的407后,相同的程序又正常,然后运行一段时间后又会不正常了。

使用特权

评论回复
8
mmuuss586| | 2015-8-3 19:39 | 只看该作者

听你最好的描述,似乎引脚容易损坏;

进AD前,串个电阻看看;

使用特权

评论回复
9
Sunny左瞳| | 2015-8-3 19:50 | 只看该作者
asun1388 发表于 2015-8-3 15:38
怎么说呢,就是买的屏不带触摸芯片,然后使用用片内AD去做触摸。
本来运行的好好的,然后重烧一次程序改 ...

哎哟,大哥啊,你这也太玄乎了吧。我敢肯定你407芯片没有烧坏,能排除吗先


其实 我分析也只是猜 :1.AD做触摸,是采样AD信号的。我们这一般先是校准,然后进行采样。一般电压在1.8V~0。当然芯片不同,规格也不一样。但是我确实没见过3V的AD采样。你先说你的芯片型号,还有屏。
2.我之前有做4组AD采样做触摸屏的,可以调的同。但要校准屏。就是在加载CORE时加上校准的命令,不校准出现烧进去程序,开始可以。后来就找不到指针了。你有没有校准屏?
3.能发你的硬件图吗?你这样说我实在想不出来还有什么我之前遇到过。

使用特权

评论回复
10
松哥无敌| | 2015-8-3 21:10 | 只看该作者
支持坐等高手来解决..

使用特权

评论回复
11
冰河w| | 2015-8-3 21:46 | 只看该作者
是不是芯片驱动能力不够

使用特权

评论回复
12
FireRiver9| | 2015-8-3 22:05 | 只看该作者
要不上程序来看看,大家集思广益

使用特权

评论回复
13
尤彼卡| | 2015-8-3 22:22 | 只看该作者
一般先是校准,然后进行采样

使用特权

评论回复
14
冰河w| | 2015-8-4 09:16 | 只看该作者
然后重烧一次程序改动很少的那种,就忽然不正常了

改动了哪里,怎么改的

使用特权

评论回复
15
asun1388|  楼主 | 2015-8-4 09:30 | 只看该作者
Sunny左瞳 发表于 2015-8-3 19:50
哎哟,大哥啊,你这也太玄乎了吧。我敢肯定你407芯片没有烧坏,能排除吗先

芯片手册上有说,VREF-<=VIN<=VREF+,VREF+连接到了VDDA上。用的是f407,100脚的。没有VREF-,所以可以认为0<=VIN<=3.3v
用的是emwin,配置中有校准参数的。
关于硬件图,我这没有这块板的。是片内AD直接与屏的触摸脚连在一起的。

使用特权

评论回复
16
asun1388|  楼主 | 2015-8-4 09:31 | 只看该作者
尤彼卡 发表于 2015-8-3 22:22
一般先是校准,然后进行采样

emwin中有校准的。

使用特权

评论回复
17
asun1388|  楼主 | 2015-8-4 09:31 | 只看该作者
冰河w 发表于 2015-8-4 09:16
改动了哪里,怎么改的

改动的是界面相关的东西,就是把改动还原,还是不正常。

使用特权

评论回复
18
lwsn| | 2015-8-5 10:29 | 只看该作者
AD做触摸一般先是校准,然后进行采样

使用特权

评论回复
19
lb10618| | 2017-1-19 10:05 | 只看该作者
你好,你以前的“stm32f407 AD引脚被拉高“问题最终是怎样解决的呢?我最近也遇到了同样的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

45

帖子

2

粉丝