完善资料让更多小伙伴认识你,还能领取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, |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
669 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
597 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1048 浏览 1 评论
731 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
520 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
158浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
120浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
123浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
122浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
164浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 22:53 , Processed in 0.792841 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号