Moderadores: andre_luis, 51, guest2003, Renie
rosiley escreveu:... tenha a finalidade de indicar ângulos ...adquiri alguns componentes para o meu projeto: ... acelerometro adxl213, pic 16f648, adc 16 bits ads 1110, multiplex cd 4051 e componentes diversos..
' =========================================================================
'
' {$STAMP BS2}
' {$PBASIC 2.5}
'
' =========================================================================
' -----[ Program Description ]---------------------------------------------
'
' Test program for the H48C 3-Axis Accelerometer module.
'
' Connections:
'
' +------------+
' | * |
' CLK | o o | Vdd (+5v)
' | +--+ |
' DIO [ o | | o | CS\
' | +--+ |
' Vss | o o | 0G (free-fall indication)
' | |
' +------------+
'
' How it Works:
'
' An onboard MCP3204 12-bit ADC is used to read the VRef, X-, Y-, and
' Z-axis outputs from the Hitachi H48C accelerometer. The reference
' voltage output from H48C is 1.65 volts (3.3 / 2).
'
' After reading the reference voltage and an output channel the g-force
' for the channel is calculated with this formula:
'
' axis - vref 3.3
' G = ----------- x ------
' 4095 0.3663
'
' For use in the program the forumla can be simplified to:
'
' G = (axis - vref) x 0.0022
'
' To allow the display of fractional g-force in the integer system of the
' BASIC Stamp we multiply 0.0022 by 100 -- this will allow us to display
' g-force in 0.01g units.
' -----[ Revision History ]------------------------------------------------
' -----[ I/O Definitions ]-------------------------------------------------
Dio PIN 15 ' data to/from module
Clk PIN 14 ' clock output
CS PIN 13 ' active-low chip select
' -----[ Constants ]-------------------------------------------------------
XAxis CON 0 ' adc channels
YAxis CON 1
ZAxis CON 2
VRef CON 3
Cnt2Mv CON $CE4C ' counts to millivolts
' 0.80586 with **
GfCnv CON $3852 ' g-force conversion
' 0.22 with **
GgCnv CON $0000 ' g-grau conversion
' 0.163339 with **
' -----[ Variables ]-------------------------------------------------------
axis VAR Nib ' axis selection
rvCount VAR Word ' ref voltage adc counts
axCount VAR Word ' axis voltage adc counts
mVolts VAR Word ' millivolts
gForce VAR Word ' axis g-force
gCount VAR Word ' graus
dValue VAR Word ' display value
dPad VAR Nib ' display pad
dGrau VAR Word ' display grau
' -----[ EEPROM Data ]-----------------------------------------------------
' -----[ Initialization ]--------------------------------------------------
Reset:
HIGH CS ' deselect module
DEBUG CLS, ' paint display
"================================", CR,
" H48C 3-Axis Accelerometer ", CR,
"================================", CR,
CR,
" Count Volts G Graus", CR,
" ----- ----- ----- -----", CR,
"VRef ", CR,
" X ", CR,
" Y ", CR,
" Z ", CR,
"Grau "
' -----[ Program Code ]----------------------------------------------------
Main:
FOR axis = XAxis TO ZAxis ' loop through each axis
GOSUB Get_H48C ' read vRef & axis counts
dValue = rvCount ' display vRef count
DEBUG CRSRXY, 6, 6
GOSUB RJ_Print
dValue = axCount ' display axis count
DEBUG CRSRXY, 6, (7 + axis)
GOSUB RJ_Print
dValue = gCount ' display grau count
DEBUG CRSRXY, 6, 10
GOSUB RJ_Print
mVolts = rvCount ** Cnt2Mv ' convert vref to mv
DEBUG CRSRXY, 13, 6, ' display
DEC (mVolts / 1000), ".",
DEC3 mVolts
mVolts = axCount ** Cnt2Mv ' convert axis to mv
DEBUG CRSRXY, 13, (7 + axis),
DEC (mVolts / 1000), ".",
DEC3 mVolts
mVolts = gCount ** Cnt2Mv ' convert mv to grau
DEBUG CRSRXY, 13, 10, ' display
DEC (mVolts / 1000), ".",
DEC3 mVolts
' calculate g-force
' -- "gForce" is signed word
IF (axCount >= rvCount) THEN
gForce = (axCount - rvCount) ** GfCnv ' positive g-force
ELSE
gForce = -((rvCount - axCount) ** GfCnv) ' negative g-force
ENDIF
DEBUG CRSRXY, 20, (7 + axis), ' display g-force
" " + (gForce.BIT15 * 13),
DEC1 (ABS(gForce) / 100), ".",
DEC2 ABS(gForce)
' calculate g-Grau
' -- "gGrau" is signed word
IF (gCount >= rvCount) THEN
dGrau = (gCount - rvCount) ** GgCnv ' positive g-grau
ELSE
dGrau = -((rvCount - gCount) ** GgCnv) ' negative g-grau
ENDIF
DEBUG CRSRXY, 27, (10), ' display g-grau
" " + (dGrau.BIT15 * 13),
DEC1 (ABS(dGrau) / 100), ".",
DEC2 ABS(dGrau)
NEXT
PAUSE 200
GOTO Main
' -----[ Subroutines ]-----------------------------------------------------
' Reads VRef and selected H48C axis through an MCP3204 ADC
' -- pass axis (0 - 2) in "axis"
' -- returns reference voltage counts in "rvCount"
' -- returns axis voltage counts in "axCounts"
Get_H48C:
LOW CS
SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, VRef\3] ' select vref register
SHIFTIN Dio, Clk, MSBPOST, [rvCount\13] ' read ref voltage counts
HIGH CS
PAUSE 1
LOW CS
SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, axis\3] ' select axis
SHIFTIN Dio, Clk, MSBPOST, [axCount\13] ' read axis voltage counts
HIGH CS
RETURN
' -------------------------------------------------------------------------
' Right-justify value in 5-digit field
' -- move cursor first, then call with value in "dValue"
RJ_Print:
LOOKDOWN dValue, >=[10000, 1000, 100, 10, 0], dPad
DEBUG REP " "\dPad, DEC dValue
RETURN
rosiley escreveu:O projeto em si é para medir ângulos com inclinação de 0 a 90 graus tanto positivo como negativo.
Djalma Toledo Rodrigues escreveu:rosiley escreveu:O projeto em si é para medir ângulos com inclinação de 0 a 90 graus tanto positivo como negativo.
É um Incrinómetro então ? Não seria mais simples e preciso usar um RESOLVER. com um pêndulo no eixo ?
lucaszampar escreveu:Bom... vamos por partes...
Fiz um projeto igual ao que está querendo fazer, e seguem algumas considerações.
É possível sim, fazer um inclinometro com um acelerometro... porém....
1) A saída de um acelerometro é a decomposicao da aceleracao G. Apenas quando o equipamento está estático. Logo, a sua saída em tensão será:
G*Seno(alpha).
Esse alpha sim é o angulo que você quer medir.
G*Seno é a saída do seu acelerometro.
2) Repare que devido à questão anterior, o inclinometro medirá muito bem angulo próximos à zero, porém perderá razoalvelmente a resolução conforme o angulo for ficando próximo à +90º e -90º.
Isso se deve ao fato que para uma pequena variação do valor de seno, há uma grande variacao no angulo.
2) Forma de saída do acelerometro: Como o pessoal e você comentou, esse ADXL que está usando possuí uma saída digital, mas colocando um filtro passa baixa, se transforma em analógica.
No meu caso, utilizei a opção analógica e passei por uma etapa com Amp. operacional....
3) Como estamos tratando de um acelerometro, e supondo saídas analógicas, é necessário realizar uma calibração no equipamento. A rotina de calibração que fiz foi fazer com que o usuário dê 360º no equipamento lentamente. Pego os valores mínimos e máximos e os defino como sendo -90º e +90º. O ponto central desses valores (Média) será o meu 0º....
Acho que é só...
qualquer coisa, posta aí....
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante