本文摘自先楫开发者@xiashuang的测评内容,分享了先楫HPM6750 如何赋能 ADS1263 实现32位高精度数据采集及处理 ,来看看吧
--------------- 以下为测评内容---------------
(本期测评开发板为 HPM6750EVK)
据官方用户手册, TI 的32位ADC:ADS1263 性能很强,最高采样到38.4k(26us),需要的处理器性能必须要具有很强的运算功能,正好试下HPM6750,于是画了一块PCB板,经过一周的等待终于到了,焊接了必要的元件就开干!
为了先验证板子的情况,先用软件vwin SPI 进行实验,需要 7 根信号线进行连接通讯,定义的GPIO如下:
*RST---------PE25
*DRDY--------PE26
*MISO--------SPI2.MISO PB25
*MOSI--------SPI2.MOSI PB22
*SCK---------SPI2.SCK PB21
*CS----------PF1
*START-------PF4
先初始化IO口,时钟的开启已经在board_init()中完成,所以指示配置一下寄存器就行
/*设置IO口为通用IO*/
HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PE25_FUNC_CTL_GPIO_E_25;
HPM_IOC->PAD[IOC_PAD_PE26].FUNC_CTL = IOC_PE26_FUNC_CTL_GPIO_E_26;
HPM_IOC->PAD[IOC_PAD_PB25].FUNC_CTL = IOC_PB25_FUNC_CTL_GPIO_B_25;
HPM_IOC->PAD[IOC_PAD_PB22].FUNC_CTL = IOC_PB22_FUNC_CTL_GPIO_B_22;
HPM_IOC->PAD[IOC_PAD_PB21].FUNC_CTL = IOC_PB21_FUNC_CTL_GPIO_B_21;
HPM_IOC->PAD[IOC_PAD_PF01].FUNC_CTL = IOC_PF01_FUNC_CTL_GPIO_F_01;
HPM_IOC->PAD[IOC_PAD_PF04].FUNC_CTL = IOC_PF04_FUNC_CTL_GPIO_F_04;
/*配置输入输出*/
/*ps-上下拉电阻 PE-上下拉开关 SMT-施密特 DS-驱动强度 OD-开漏 MS-电压选择*/
uint32_t pad_ctl_out = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
uint32_t pad_ctl_in = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1)|IOC_PAD_PAD_CTL_SMT_SET(1);
gpio_set_pin_output_with_initial(HPM_GPIO0, GPIO_DO_GPIOE, 25, 1);
gpio_set_pin_output_with_initial(HPM_GPIO0, GPIO_DO_GPIOB, 22, 1);
gpio_set_pin_output_with_initial(HPM_GPIO0, GPIO_DO_GPIOB, 21, 1);
gpio_set_pin_output_with_initial(HPM_GPIO0, GPIO_DO_GPIOF, 01, 1);
gpio_set_pin_output_with_initial(HPM_GPIO0, GPIO_DO_GPIOF, 04, 1);
HPM_IOC->PAD[IOC_PAD_PE25].PAD_CTL = pad_ctl_out;
HPM_IOC->PAD[IOC_PAD_PB22].PAD_CTL = pad_ctl_out;
HPM_IOC->PAD[IOC_PAD_PB21].PAD_CTL = pad_ctl_out;
HPM_IOC->PAD[IOC_PAD_PF01].PAD_CTL = pad_ctl_out;
HPM_IOC->PAD[IOC_PAD_PF04].PAD_CTL = pad_ctl_out;
HPM_IOC->PAD[IOC_PAD_PE26].PAD_CTL = pad_ctl_in;
HPM_IOC->PAD[IOC_PAD_PB25].PAD_CTL = pad_ctl_in;
相应的IO输出及输入读取如下:
#define ADS1263_RESET_H gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOE, 25, 1)
#define ADS1263_RESET_L gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOE, 25, 0)
#define ADS1263_START_H gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOF, 4, 1)
#define ADS1263_START_L gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOF, 4, 0)
#define ADS1263_CS_H gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOF, 1, 1)
#define ADS1263_CS_L gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOF, 1, 0)
#define ADS1263_SCLK_H gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOB, 21, 1)
#define ADS1263_SCLK_L gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOB, 21, 0)
#define ADS1263_DIN_H gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOB, 22, 1)
#define ADS1263_DIN_L gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOB, 22, 0)
#define ADS1263_DOUT gpio_read_pin(HPM_GPIO0, GPIO_DI_GPIOB, 25)
#define ADS1263_DRDY gpio_read_pin(HPM_GPIO0, GPIO_DI_GPIOE, 26)
初始化ADS1263
int init_ads1263(void)
{
printf("*************************************************************\r\n");
printf("* *\r\n");
printf("* ADS1263 TEST ^_^ *\r\n");
printf("* *\r\n");
printf("*************************************************************\r\n");
GPIO_Configuration();
ADS1263_INIT();//ADS1263初始化
ADS1263_CS_L;
Delay(0xf);
ADS1263_WRITE(0x08);//START1 command,当START引脚为低电平时,可由此命令启动ADC1的转换。
ADS1263_CS_H;
Delay(0xf);
return 0;
}
读取AD值
int read_ads1263(void)
{
if(ADS1263_DRDY != 1)
{
ADS1263_CS_L;
Delay(0xf);
ADS1263_WRITE(0x12);//读取ADC1
STATUS=ADS1263_READ_REG();
ADC1_DATA=ADS1263_READ();
checksum = ADS1263_READ_REG();
ADS1263_CS_H;
count++;
D[47]++;
if(D[76] > 0)
{
ADC1_DATA = Filter_ch1(ADC1_DATA,D[76],D[77]);
}
ADC1_DATA = CELL_ADSOURSE_FILTER(ADC1_DATA,D[78],D[79]);
mv_Now = ADC1_DATA / 2147483648.0 * 2500 / 32;//mv数
//测试重量参数
Weight = (mv_Now - mv_Zero)/ 10.0f * mv_Full * mv_Cali;
INT32toREG(ADC1_DATA,&D[0]);//源码
FP32toREG(mv_Now,&D[2]);//mv数
FP32toREG(Weight,&D[4]);//重量
//校秤参数
mv_Zero = REGtoFP32(&D[70]);//mv零点
mv_Full = REGtoFP32(&D[72]);//满量程
mv_Cali = REGtoFP32(&D[74]);//校准系数
return ADC1_DATA;
}
else
return 0;
}
利用上次移植的modbus 裸机例子,在主循环中不断查询AD状态读取。
连接好线,接上称重传感器开始测试
MODBUS上位机画面,使用50kg C3电阻应变桥式称重传感器采样400次精度在±1g,后来降低采样到60次/s,滑动平均5次,精度在±0.2g 。
逻辑分析仪抓取波形图。采用软件模拟SPI,速度在3M左右,读取命令+状态+4字节数据+校验共7个字节数据在20.5us左右
【实验总结】
HPM6750 在配置IO时要注意名称,因为IO引脚较多,宏定义也比较多,在初始化容易写错(这次因为IO编号写错导致两个IO口没有输出,查了1个多小时)。看来图形化代码工具还是很有必要的(*悄咪咪告诉你们,先楫图形化代码工具已经上线使用中啦);
HPM6750 的驱动强度和施密特单独出来和I.MX RT系列比较像增加了IO控制的灵活性,PCB上高速信号的抗信号反射电阻和驱动限流电阻都可以省去了,等以后试下芯片的施密特能否代替外部输入上的 74HC14;
HPM6750 运算速度很快,等以后试试高阶FIR看看;
ADS1263 的高速采样及其以来模拟电源的纹波,对内部DCDC电源还是要增加滤波器,采样60HZ对50-hz和60hz纹波抑制后精度一下就上来了;
--------------- 以上为全部测评内容---------------
本期的测评分享就到这里,若想获取更多关于HPM6750的精彩内容,可点击下面 “ 阅读原文 ”了解详情哦~
-
开发板
+关注
关注
25文章
5032浏览量
97370
发布评论请先 登录
相关推荐
评论