TI论坛
直播中

吴湛

10年用户 908经验值
擅长:417804
私信 关注
[问答]

STM32F103ZET6读取AD转换的结果不正常的原因?怎么解决?

STM32F103ZET6目前读取AD转换的结果不正常,输出值总是恒定在某几个值上面(1,3,7,15,31,63,127,255,510,1020,2040,4080,8160,16320,32767..........),但是数值并不是随机变化,跟输入电压有一定关系,例如,输入电压从2V变化到2.5V时都是16320,输出数据都一样,可能要一直等到输入电压大于4v后才改变输出数据为32767。同样的程序在其他板子的现象是:在STM32F103C8T6读的数据就是正确的,在一块STM32F103ZET6学习板上读取数据不正常,但是只要将CS,SDO引出接入示波器数据就正确了。以下是代码,电路图和TLC4541手册。请大家帮忙分析一下原因和解决方法,谢谢。

#define A0_Pin            GPIO_Pin_4#define A0_GPIO_Port      GPIOB#define A1_Pin            GPIO_Pin_5#define A1_GPIO_Port      GPIOB#define A2_Pin            GPIO_Pin_8#define A2_GPIO_Port      GPIOB#define Z_Pin             GPIO_Pin_9#define Z_GPIO_Port       GPIOB#define AD_CS_Pin         GPIO_Pin_3#define AD_CS_GPIO_Port   GPIOB#define AD_SDO_Pin        GPIO_Pin_15#define AD_SDO_GPIO_Port  GPIOG#define SCLK_Pin          GPIO_Pin_14#define SCLK_GPIO_Port    GPIOG/*===============================================================   相关引脚配置:A0,A1,A2,Z控制增益,        入口参数:无        返回参数:无===============================================================*/                                                                                                                                void tlc4541_IOInit(){   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG,ENABLE);                GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //将PB3,PB4配置为普通GPIO        GPIO_InitTypeDef   GPIO_InitStructure;        //A0        GPIO_InitStructure.GPIO_Pin = A0_Pin;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出        GPIO_Init(A0_GPIO_Port,  &GPIO_InitStructure);        GPIO_WriteBit(A0_GPIO_Port, A0_Pin, Bit_RESET);//初始化为低电平        //A1        GPIO_InitStructure.GPIO_Pin = A1_Pin;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出        GPIO_Init(A1_GPIO_Port, &GPIO_InitStructure);        GPIO_WriteBit(A1_GPIO_Port, A1_Pin, Bit_RESET);//初始化为低电平                //A2        GPIO_InitStructure.GPIO_Pin = A2_Pin;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出        GPIO_Init(A2_GPIO_Port, &GPIO_InitStructure);        GPIO_WriteBit(A2_GPIO_Port, A2_Pin, Bit_RESET);;//初始化为低电平                        //CS片选        GPIO_InitStructure.GPIO_Pin = AD_CS_Pin;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出        GPIO_Init(AD_CS_GPIO_Port, &GPIO_InitStructure);        GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_SET);//初始化为高电平                                //Sdo数据        GPIO_InitStructure.GPIO_Pin = AD_SDO_Pin;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入        GPIO_Init(AD_SDO_GPIO_Port, &GPIO_InitStructure);        //Sclk时钟        GPIO_InitStructure.GPIO_Pin = SCLK_Pin;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出        GPIO_Init(SCLK_GPIO_Port, &GPIO_InitStructure);        GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);//初始化为低电平}                                                                                                                                                                                                                                                                /*===============================================================    读SDO引脚的值        入口参数:无        返回参数:无===============================================================*/uint8_t Get_AD_value(void){        return GPIO_ReadInputDataBit(AD_SDO_GPIO_Port, AD_SDO_Pin);}/*===============================================================    AD初始化        入口参数:无        返回参数:无===============================================================*/void tlc4541_init(){  uint8_t i = 0;        GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_RESET);                for(i=0; i<6; i++)         {                GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);                delay_us(1);                GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);          delay_us(1);        }        GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin, Bit_SET);}/*===============================================================   AD初始化判断        入口参数:无        返回参数:AD初始化标志,===============================================================*/uint8_t tlc4541_start(void){        tlc4541_init();        if (tlc4541_get() == 0xFF00)        {                return 1;        }        else        {                return 0;        }}/** 函数名:tlc4541_get* 输入参数:* 输出参数:无* 返回值:读到的数据* 函数作用:模拟 SPI 读16位数值*/uint16_t tlc4541_get(void) {                volatile uint16_t result0 = 0x0000;                volatile uint8_t i = 0;                volatile uint16_t temp = 0;                GPIO_WriteBit(AD_CS_GPIO_Port, AD_CS_Pin,  Bit_RESET);                //开始读取16数据                for(i=0; i<16; i++) {                        GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);                        result0 <<= 1;                        delay_us(1);                        GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);                        temp = (uint32_t)Get_AD_value();                        result0 |= ( (temp) & 0x0001 );                        delay_us(1);                }        //转换时间                for( i=0; i<8; i++ )                {                        GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_SET);                        delay_us(2);                        GPIO_WriteBit(SCLK_GPIO_Port, SCLK_Pin, Bit_RESET);                        delay_us(2);                }                //周期结束复位                GPIO_WriteBit(AD_CS_GPIO_Port,

回帖(1)

王秀兰

2024-11-23 16:23:43
根据您提供的信息,STM32F103ZET6读取AD转换结果不正常的原因可能有以下几点:

1. 硬件问题:可能是STM32F103ZET6学习板上的硬件存在问题,导致AD转换结果异常。您提到将CS和SDO引出接入示波器后数据正常,这可能说明硬件连接存在问题。

2. 代码问题:可能是您的代码中存在问题,导致AD转换结果不正常。您提到在STM32F103C8T6上读取的数据是正确的,这可能说明代码在不同硬件平台上的表现不同。

3. TLC4541问题:可能是TLC4541芯片存在问题,导致AD转换结果不正常。

为了解决这个问题,您可以尝试以下步骤:

1. 检查硬件连接:仔细检查STM32F103ZET6学习板上的硬件连接,确保所有连接都正确无误。特别是CS和SDO引脚的连接,确保它们没有短路或接触不良的问题。

2. 检查代码:检查您的代码,确保AD转换和数据处理部分没有问题。您可以尝试在STM32F103ZET6上运行其他AD转换程序,看看是否也存在同样的问题。如果其他程序也存在问题,那么可能是代码问题。

3. 更换TLC4541芯片:尝试更换TLC4541芯片,看看是否能够解决问题。如果更换芯片后问题解决,那么可能是TLC4541芯片存在问题。

4. 检查电源和地线:检查STM32F103ZET6学习板上的电源和地线连接,确保它们都正确无误。不稳定的电源和地线连接可能会导致AD转换结果异常。

5. 更新固件和库文件:确保您的STM32F103ZET6学习板上的固件和库文件都是最新的,以避免可能的兼容性问题。

通过以上步骤,您应该能够找到导致STM32F103ZET6读取AD转换结果不正常的原因,并采取相应的解决措施。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分