完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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个回答
|
|
根据您提供的信息,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转换结果不正常的原因,并采取相应的解决措施。 |
|
|
|
只有小组成员才能发言,加入小组>>
336 浏览 1 评论
529 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
774 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
651 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1130 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
58浏览 29评论
144浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
252浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
201浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
57浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 12:16 , Processed in 0.851960 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号