Estoy trabajando en un proyecto de frenado regenerativo con un motor de CC. Mi Beaglebone Black maneja un pequeño DC Motor utilizando un controlador de motor TB6612FNG de Sparkfun ( hoja de datos ):
Todofuncionabien,exceptoqueaveces,cuandomanejoelmotordeunladoaotroytratodeleeruncanalADC,miprogramasecuelga(nisiquierapuedopresionarCtrl-Z)ydosminutosdespuésobtengounapilademódulosdelkernel.trazadeldmesg
delkernel:
[840.290177]INFO:taskdrive_motor:656blockedformorethan120seconds.[840.297231]Tainted:GO4.1.12-bone-rt-r16#3[840.312263]"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 840.322102] drive_motor D c065b9b7 0 656 606 0x00000001
[ 840.328856] [<c065b9b7>] (__schedule) from [<c065bc11>] (schedule+0x35/0x90)
[ 840.340345] [<c065bc11>] (schedule) from [<bf86416f>] (am335x_tsc_se_set_once+0x8e/0xcc [ti_am335x_tscadc])
[ 840.352180] [<bf86416f>] (am335x_tsc_se_set_once [ti_am335x_tscadc]) from [<bf8873bb>] (tiadc_read_raw+0x86/0x118 [ti_am335x_adc])
[ 840.365891] [<bf8873bb>] (tiadc_read_raw [ti_am335x_adc]) from [<bf86fa4b>] (iio_read_channel_info+0x52/0x54 [industrialio])
[ 840.379287] [<bf86fa4b>] (iio_read_channel_info [industrialio]) from [<c041c3eb>] (dev_attr_show+0x13/0x34)
[ 840.391418] [<c041c3eb>] (dev_attr_show) from [<c0173907>] (sysfs_kf_seq_show+0x63/0xb0)
[ 840.401550] [<c0173907>] (sysfs_kf_seq_show) from [<c013d4c3>] (seq_read+0x157/0x300)
[ 840.411700] [<c013d4c3>] (seq_read) from [<c0124c2d>] (__vfs_read+0x19/0x88)
[ 840.420677] [<c0124c2d>] (__vfs_read) from [<c01251c1>] (vfs_read+0x55/0xf4)
[ 840.429580] [<c01251c1>] (vfs_read) from [<c01258cd>] (SyS_read+0x31/0x6c)
[ 840.438240] [<c01258cd>] (SyS_read) from [<c000e821>] (ret_fast_syscall+0x1/0x4c)
Puedo reproducir el problema ejecutando un programa que impulsa el motor al 100% del ciclo de trabajo, invierte la dirección cada segundo y lee el ADC:
set pwm to 100%
while true:
read ADC
switch direction of motor
sleep for 1 second
(Mi código real es C puro y utiliza este código C debajo de la Adafruit BBIO Python library para lea los ADC y también use módulo del kernel PWM de Saad Ahmad .)
La resistencia de la bobina del motor es de 2,5 ohmios y la conduzco con una batería de 6V, por lo que la corriente de bloqueo es de 2.4A, que parece estar (algo) dentro de especificaciones del controlador del motor .
El programa no se bloquea si elimino la llamada para leer el ADC, y no se bloquea si desconecto la batería.
Significativamente, no se cuelga si conduzco el motor en un ciclo de trabajo bajo (como 20%) en lugar de un ciclo de trabajo alto (como 80% - 100%). Esto sugiere que las corrientes del motor están de alguna manera abriéndose camino hacia el Beaglebone y estropeando los ADCs.
El programa se cuelga independientemente de si conecto la conexión a tierra analógica (AGND) a la conexión a tierra del sistema Beaglebone (GND) (la línea rosa en la imagen). Cuando están desconectados, la función "máx" de mi DMM mide un pico de 70 mV entre ellos cuando el motor cambia de dirección.
Como muestra la imagen, el terminal negativo de la batería está conectado a "GND" en el lado derecho del controlador del motor. El programa se cuelga en esta configuración. Además, el programa también se bloquea si conecto el controlador de motor del lado derecho "GND" a su "GND" de la izquierda. Mi sensación es que estos deben permanecer desconectados debido a las grandes corrientes a través de la batería.
Hay un condensador de 0.1 uF en los terminales del motor. Mi medidor LCR de mierda dice que la inductancia del motor es de 1 mH. No he colocado ningún otro condensador en el circuito.
He disfrutado estos mensajes muy informativos de Phil Frost , SunnyBoyNY y supercat .
Mi conjetura es que los cambios repentinos en la dirección del motor hacen que los picos de corriente excedan el límite de 3A establecido en hoja de datos del controlador , superando la capacidad del conductor del motor para aislar el lado de Beaglebone del lado del motor, y dejar que la corriente se filtre en el Beaglebone y atornillar el voltaje del que dependen los ADC.
Realmente apreciaría los pensamientos de la comunidad sobre esto.
- ¿Es esta una conclusión razonable?
- ¿Se supone que el conductor del motor debe aislar el lado del motor del lado Beaglebone?
- ¿Debería usar un controlador de motor más apropiado?