TA的每日心情 | 衰 2017-11-27 16:33 |
---|
签到天数: 7 天 连续签到: 1 天 [LV.3]偶尔看看II
|
电感式传感是一种无接触、无磁体的传感技术,可精确测量金属或导电目标的位置、运动或成分,也可用于检测弹簧的压缩、拉伸或扭曲。在模拟半导体行业拥有近 20 年经验的德州仪器 (TI)传感器信号路径产品线经理Jon Baldwin向记者展示了LDC1000的优越性能,无论低成本 PCB 线迹或金属,亦或是人体传感,LDC1000都能 迅速传感并显示精确的结果。现有的传感器,如低成本的OHMIC开关传感器在灰尘等恶劣环境下不可靠,FSR压力传感器分辨率有限、不适合遥感、成本稍 高,高端一些的超成波传感器不适合短距离传感,电容式传感器灵敏度高可针对被选择物的选择性不高,HALL传感器存在精度问题、需要磁体和校准,光学传感 器在恶劣环境下不可靠,这些传感器都或多或少存在这样和那样的缺点,而TI此次推出的电感数字转换器颠覆了现有传感器的现状,在分辨率、精度、灵敏度、灵 活性等方面均优于传统的传感器类型,能给设计师带来更多的设计灵感。同时,Jon表示,由于LDC技术的优势明显,非常适合工厂流水线上的运动状态的传感 检测,在工业机器人及智能工厂等工业领域将发挥良好作用。
LDC 技术的主要优势:
• 更高的分辨率:可通过 16 位共振阻抗及 24 位电感值,在位置传感应用中实现亚微米级分辨率;
• 更高的可靠性:提供非接触传感技术避免受油污尘土等非导电污染物的影响,可延长设备使用寿命;
• 更高的灵活性:允许传感器远离电子产品安放,处于 PCB 无法安放的位置;
• 更低的系统成本:采用低成本传感器及传导目标,无需磁体;
• 无限可能性:支持压缩的金属薄片或导电油墨目标,可为创造性创新系统设计带来无限可能;
• 更低的系统功耗:标准工作时功耗不足 8.5mW,待机模式下功耗不足 1.25mW。
打算利用GD32做一个金属巡线小车,所以就上手来调一下这个传感器,模拟SPI,挺好移植的。
放入U盘 电感值有比较大的变化
- #include "include.h"
- extern int LDC_val;
- int main(void)
- {
- systick_config();
-
- UART_Init(Debug_UART,115200);
- LED_Init();
- LDC1000_Init();
- while(1)
- {
- LED_Troggle();
- LDC_val=LDC_Read_Avr()/10;//采样滤波
- printf("当前通道值:%d\r\n",LDC_val);
- }
- }
复制代码
- #include "LDC1000.h"
- #define NN 20
- uint8 orgVal[12]={0};
- uint8 RPMAX =0x07;
- uint8 RPMIN =0x2f;
- uint8 RFREQ =0xA9;
- uint8 rpi_max=10;
- uint8 proximtyData[2]={0};
- unsigned long proximtyDataTEMP=0,proximtyDataMAX,proximtyDataMIN,proximtyDataSUM,proximtyDataAVE,proximtyDataAVE_LAS;
- unsigned long value_buf[NN],new_value_buf[NN];
- int LDC_val=0;
- void LDC1000_Init(void)
- {
- while(orgVal[1]!=RPMAX||orgVal[2]!=RPMIN||orgVal[3]!=RFREQ)//一旦在此循环说明初始化不成功
- {
- LDC_SPI_init();
- Delay_us(3000);
- LDC_Singal_SPI_Write(LDC1000_CMD_RPMAX, RPMAX);
- LDC_Singal_SPI_Write(LDC1000_CMD_RPMIN, RPMIN);//0x14
- LDC_Singal_SPI_Write(LDC1000_CMD_SENSORFREQ, RFREQ);//谐振频率计算
- LDC_Singal_SPI_Write(LDC1000_CMD_LDCCONFIG, 0x17);
- LDC_Singal_SPI_Write(LDC1000_CMD_CLKCONFIG, 0x00);//配置LDC1000的输出速率
- LDC_Singal_SPI_Write(LDC1000_CMD_THRESHILSB, 0x50);
- LDC_Singal_SPI_Write(LDC1000_CMD_THRESHIMSB, 0x14);
- LDC_Singal_SPI_Write(LDC1000_CMD_THRESLOLSB, 0xC0);
- LDC_Singal_SPI_Write(LDC1000_CMD_THRESLOMSB, 0x12);
- LDC_Singal_SPI_Write(LDC1000_CMD_INTCONFIG, 0x02);
- LDC_Singal_SPI_Write(LDC1000_CMD_PWRCONFIG, 0x01);
- LDC_SPI_Read_Buf(LDC1000_CMD_REVID,&orgVal[0],12); //orgVal[]对应上面写入的值说明初始化正常
- }
- }
- int LDC_Read_Avr(void)
- {
- char rpi=0; //取rpi次平均值
- for (rpi=0;rpi<rpi_max;rpi++)
- {
- LDC_SPI_Read_Buf(LDC1000_CMD_PROXLSB,&proximtyData[0],2);
- proximtyDataTEMP = ((unsigned char)proximtyData[1]<<8) + proximtyData [0];
- proximtyDataSUM += proximtyDataTEMP;
- if (proximtyDataTEMP < proximtyDataMIN) //在100个proximtyDataTEMP中取最大,最小
- proximtyDataMIN = proximtyDataTEMP;
- if (proximtyDataTEMP > proximtyDataMAX)
- proximtyDataMAX = proximtyDataTEMP;
- }
- proximtyDataAVE = proximtyDataSUM /rpi_max;
- proximtyDataSUM=0;
- proximtyDataAVE_LAS=proximtyDataAVE;
- return proximtyDataAVE;
- }
- long int filter()
- {
- char count,i,j,count1;
- char count2=0;
- long int temp;
- long int sum=0;
-
- for(count=0;count<NN;count++)
- {
- value_buf[count] = LDC_Read_Avr();
- }
-
- for(count1=0;count1<NN;count1++)
- {
- if(value_buf[count1]<32768)
- {
- new_value_buf[count2]=value_buf[count1];
- count2++;
- }
- }
-
- for (j=0;j<count2-1;j++)
- {
- for (i=0;i<count2-j;i++)
- {
- if ( new_value_buf[i]>new_value_buf[i+1] )
- {
- temp = new_value_buf[i];
- new_value_buf[i] = new_value_buf[i+1];
- new_value_buf[i+1] = temp;
- }
- }
- }
- for(count=1;count<count2-1;count++)
- {
- sum += new_value_buf[count];
- }
- return (long int)(sum/(count2-2));
- }
- void LDC_SPI_init(void)
- {
- GPIO_Init(LDC1000_PORT,MISO_Pin,Input);
- GPIO_Init(LDC1000_PORT,SCK_Pin, PP_Output_L);
- GPIO_Init(LDC1000_PORT,MOSI_Pin,PP_Output_H);
- GPIO_Init(LDC1000_PORT,CSN_Pin, PP_Output_H);
- }
- uint8 LDC_SPI_RW(uint8 rwdata)
- {
- uint8 spi_rw_i=0;
- uint8 temp=0;
- for(spi_rw_i=0;spi_rw_i<8;spi_rw_i++)
- {
- if(rwdata & 0x80)
- { MOSI_H;}
- else
- { MOSI_L;}
- rwdata<<=1;
- temp<<=1;
- SCK_H;
- if(MISO) temp|=1;
- SCK_L;
- }
- return(temp);
- }
- uint8 LDC_Singal_SPI_Read(uint8 reg)
- {
- uint8 rdata;
-
- CSN_L;
-
- Delay_us(2);
-
- reg=reg|0x80;
- LDC_SPI_RW(reg);
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
-
- rdata = LDC_SPI_RW(NULL);
-
- Delay_us(1700);
- CSN_H;
-
- return rdata;
- }
- void LDC_Singal_SPI_Write(uint8 reg,uint8 wdata)
- {
-
- CSN_L;
- Delay_us(2);
- reg=reg&~0x80;
- LDC_SPI_RW(reg);
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
- __asm("nop");
-
- LDC_SPI_RW(wdata);
- Delay_us(1700);
- CSN_H;
- }
- void LDC_SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 len)
- {
- uint8 spi_rw_i;
-
- CSN_L;
-
- reg=reg|0x80;
- LDC_SPI_RW(reg);
-
- for(spi_rw_i=0;spi_rw_i<len;spi_rw_i++)
- {
- pBuf[spi_rw_i] = LDC_SPI_RW(NULL);
- }
- CSN_H;
- }
复制代码
- #ifndef _LDC1000_H_
- #define _LDC1000_H_
- #include "gpio.h"
- #include "systick.h"
- #define LDC1000_PORT GPIOD
- #define MISO_Pin GPIO_PIN_3
- #define MOSI_Pin GPIO_PIN_4
- #define CSN_Pin GPIO_PIN_5
- #define SCK_Pin GPIO_PIN_6
- #define MISO gpio_input_bit_get(LDC1000_PORT, MISO_Pin)
- #define MOSI_H GPIO_BOP(LDC1000_PORT)=MOSI_Pin;
- #define MOSI_L GPIO_BC(LDC1000_PORT)=MOSI_Pin;
- #define CSN_H GPIO_BOP(LDC1000_PORT)=CSN_Pin;
- #define CSN_L GPIO_BC(LDC1000_PORT)=CSN_Pin;
- #define SCK_H GPIO_BOP(LDC1000_PORT)=SCK_Pin;
- #define SCK_L GPIO_BC(LDC1000_PORT)=SCK_Pin;
- void LDC1000_Init(void);
- int LDC_Read_Avr(void);
- long int Filter(void);
- void LDC_SPI_init(void);
- uint8 LDC_SPI_RW(uint8 rwdata);
- uint8 LDC_Singal_SPI_Read(uint8 reg);
- void LDC_Singal_SPI_Write(uint8 reg,uint8 wdata);
- void LDC_SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 len);
- //LDC1000指令
- #define LDC1000_CMD_REVID 0x00
- #define LDC1000_CMD_RPMAX 0x01
- #define LDC1000_CMD_RPMIN 0x02
- #define LDC1000_CMD_SENSORFREQ 0x03//谐振频率
- #define LDC1000_CMD_LDCCONFIG 0x04
- #define LDC1000_CMD_CLKCONFIG 0x05
- #define LDC1000_CMD_THRESHILSB 0x06
- #define LDC1000_CMD_THRESHIMSB 0x07
- #define LDC1000_CMD_THRESLOLSB 0x08
- #define LDC1000_CMD_THRESLOMSB 0x09
- #define LDC1000_CMD_INTCONFIG 0x0A
- #define LDC1000_CMD_PWRCONFIG 0x0B
- #define LDC1000_CMD_STATUS 0x20
- #define LDC1000_CMD_PROXLSB 0x21
- #define LDC1000_CMD_PROXMSB 0x22
- #define LDC1000_CMD_FREQCTRLSB 0x23
- #define LDC1000_CMD_FREQCTRMID 0x24
- #define LDC1000_CMD_FREQCTRMSB 0x25
- //LDC1000寄存器
- #define LDC1000_BIT_AMPLITUDE 0x18
- #define LDC1000_BIT_RESPTIME 0x07
- #define LDC1000_BIT_CLKSEL 0x02
- #define LDC1000_BIT_CLKPD 0x01
- #define LDC1000_BIT_INTMODE 0x07
- #define LDC1000_BIT_PWRMODE 0x01
- #define LDC1000_BIT_STATUSOSC 0x80
- #define LDC1000_BIT_STATUSDRDYB 0x40
- #define LDC1000_BIT_STATUSWAKEUP 0x20
- #define LDC1000_BIT_STATUSCOMP 0x10
- #endif
- /*----------------------------end of LDC1000.h-------------------------------*/
复制代码 附件:
myGD32 - 副本.rar
(7.24 MB, 下载次数: 9)
|
|