说明
本应用说明介绍了从 Fredericks 电解倾斜传感器获取角度位置测量值所需的最低硬件和软件要求。
基本设计和传感器激励
图1显示了使用电解倾斜传感器创建一个正常的倾斜测量装置所需的主要组件。
正如您稍后将看到的那样,避免向传感器提供直接电流是很重要的。因此,我们建议使用具有高输入阻抗的运算放大器,如德州仪器的LMC6482。这将限制对地的电流泄漏,进而限制对传感器的直接电流。图2为单轴电解倾斜传感器的等效电路。
我们继续说说传感器的激励信号。激励信号由微处理器提供,最简单的情况是单轴传感器。单轴传感器需要微处理器的两个输出端口,这两个端口连接到传感器的外引脚。这两个端口的占空比为50%,周期在200到1000赫兹之间,是可以拨动的。见图3。
需要在软件中精确计时,以保持50%的占空比,防止传感器激励信号的不对称。见图4。不对称的定义是:对传感器的直流电导致漂移,并最终对传感器造成永久性和不可逆的损坏。这可以用化学方法来解释;直流电导致电解发生,最终使传感器失去活性。
让我们来看看使用CCS PCW C编译器在软件中为PIC18F微处理器创建激励信号的过程。这些指令将根据您特定的微处理器和编译器而有很大的不同。我们将从定义哪些引脚将用于输出开始。我们将使用 PORTB 进行输出,因此我们需要将其定义为 PORTB。这是通过设置8位数据方向寄存器(称为TRISB)来实现的。TRISB 中的位被设置为 0,将把相应的 PORTB 引脚定义为输出,因此我们将使用以下一行代码来使用所有 PORTB 引脚进行输出。
set_tris_b(0b00000000); |
为了快速改变PORTB引脚值,我们需要在内存中访问它。在这个特定的微处理器上,PORTB是一个特殊功能寄存器(SFR),它位于内存地址0xf81。因此,我们将把PORTB的位置存储在一个变量中,以便于访问。这可以通过以下一行代码来实现。
#byte port_b = 0xf81。 |
现在,port_b中的每一个位都对应着芯片上的一个引脚,最重要的位是引脚B8,最不重要的位是引脚B0。最重要的位是引脚B8,最不重要的位是引脚B0。我们假设一个单轴传感器连接到引脚B0和B1。见图3。如果您使用的是双轴传感器,我们假设它连接到引脚B0、B1、B2和B3。
对于单轴传感器,激励信号有两种状态。见图4。为了模仿这个时序图,这两个状态可以存储在一个8位数的数组中。这可以通过以下一行代码来实现。
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
对于双轴传感器,激励信号有四种状态。见图5。为了模仿这个时序图,这四种状态可以存储在一个8位数的数组中。这可以通过以下一行代码来实现。
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
定时器是一种常用的工具,在软件中以精确的时间间隔产生中断,它们可以用来轻松产生激励信号。我们必须使用高优先级的中断,使激励信号保持50%的占空比。下面的代码创建了一个高优先级中断,它可以切换端口,为双轴传感器产生激励信号。
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
在这个例子中,timer1是一个16位的计数器(0到65535)。这意味着它将从set_timer()设置的值开始计数,当它溢出(达到65535)时,将产生一个中断,并执行timer1_isr()函数中的代码。溢出的时间由多种因素决定,包括微处理器的时钟速度和timer1的设置参数等。重要的是要保持1到5毫秒的中断时间,以确保传感器的正确激励。有关此信息,请参考各个微处理器的手册。
端口的切换是通过使用模数函数来实现的。每次产生中断时,isr_counter 都会被递增,并对其进行模数 4。这实质上使一个计数器从0到3计数,随着每次中断的产生而递增。这将访问存储在output_arr中的四个状态中的每一个状态,这四个状态构成了激励信号。
传感器输出
现在我们已经创建了一个激励信号,让我们检查一下传感器的输出。输出是参考激励电压的模拟电压。输出必须与激励信号同相读取。建议在四种状态中的每一种状态(单轴传感器为两种状态)中采集多个样本。
图6中的波形显示了连接到双轴传感器输出的模数转换器的一个输出示例。这个特定的输出指示了x轴和y轴的正倾斜角。请参阅图7了解指示负倾斜角的输出。
为了读取输出,我们需要使用微处理器的模数转换器(ADC)。从图3来看,我们需要将A0引脚设置为ADC输入,然后将当前ADC端口设置为A0引脚。然后我们可以执行下面的代码来读取双轴传感器的输出与激励信号的相位。
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
如你所见,在激励信号的每个状态内,我们都在收集8个样本,样本之间有0.1毫秒的延迟。然后,这些样本可以在数据分析代码中进行平均,以提供一个更稳定和准确的结果。通过引用isr_counter,我们能够确保读数与激励信号相位一致。
倾斜角的推导
传感器的倾斜角可以通过比较每个激励状态的电压之间的差异来得出。
X轴倾斜度=(X+)-(X-)。
Y轴倾斜度=(Y+)-(Y-)。
假设我们有一个16位(0到65535个计数)的模数转换器,读取来自±20°双轴传感器的输出。这意味着我们的输出范围是±65535计数,使用上面的X和Y轴倾斜的定义。让我们来看看下面一个周期的输出。
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
然后,我们可以得出以下结论:
X轴倾斜度=+25535
Y轴倾斜度=-5535
现在将其转换为角度测量。
±65535个计数=131070个计数范围
±20°=40°范围
131070个计数/40°=~3277个计数/°。
25535个计数/(3277个计数/°)=~+7.79°x轴倾斜度。
-5535个计数/(3277个计数/°)= ~-1.69°y轴倾斜度
倾斜角推导时的机械考虑因素
所有的传感器都有机械公差,它们的操作规范通常只表明其总范围的一部分。此外,上述计算假设了来自传感器的线性、对称和居中的输出,而事实通常并非如此。因此,重要的是要确定您在应用中使用的传感器的具体类型,以便得出真正的倾斜位置。
例如,让我们考虑一个单轴±25°电解传感器。图8显示了这种倾斜传感器的机械功能。
假设这次我们有一个12位(0到4095个计数)的模数转换器读取传感器的输出。这意味着我们的输出范围是±4095个计数,使用上一节中X轴倾斜的定义。为了单独描述传感器的特性,我们将首先把它倾斜到-25°,并进行读数。让我们来检查以下在-25°倾斜时一个周期的输出。
X+ = 400
X- = 3700
X轴在-25°时的倾斜度=400-3700=-3300。
然后,我们将传感器倾斜到+25°,并再次测量读数。让我们来看看下面的输出,在倾斜+25°时的一个周期。
X+ = 3700
X- = 400
X轴倾斜度为+25°=3700-400=3300。
然后我们可以进行以下计算。
3300-(-3300)=6600计数范围
±25°=50°范围
6600个计数/50°=132个计数/°。
知道了每度的计数数,就可以轻松地将模拟数字转换器的读数转换为角度位置。进一步补偿线性、对称性和零位,将显著提高角度计算的精度。
软件考虑因素
与所有软件一样,有许多不同的方法来实现同一个目标。本文件只是介绍了一个例子,说明如何通过使用特定的微处理器和编译器来实现电解倾斜传感器信号调节。