Hard Disk Motortreiber mit ATtiny13            

von Gerd Sinning                         
Elektronik-Labor   Projekte   AVR 

Vor kurzem habe ich mal wieder eine alte Harddisk auseinandergenommen. Darin sind viele nützliche Bauteile, im Zentrum ist ein Harddisk-Motor, der die Disk antreibt. Viel zu Schade um ihn wegzuwerfen und Recycling ist angesagt. Den Motor müsste man wieder in Betrieb nehmen können, aber er braucht einen Treiber, sonst läuft er nicht. Ein paar Messungen mit dem Ohmmeter zeigen: es gibt einen Anschluss in der Mitte und drei Wicklungen mit je 3,3 Ohm. Das ist eine Y-Schaltung, ähnlich wie ein unipolarer Schrittmotor oder ein brushless Motor.

Die Rückseite, oben ist der Anschluss in der Mitte (geht an +5V) und dann kommen die Wicklungen 1, 2 und 3.

Die Schaltung ist recht einfach, der Tiny 13 erzeugt im Timer0_compa Interrupt drei um 120 Grad phasenverschobene Impulse, die die Motorwicklungen ansteuern. Ein ULN2803 liefert den Strom. Das ginge auch mit 3 Transitoren und Schutzdioden, aber so war es übersichtlicher. Die Frequenz und damit die Drehzahl wird mit dem Potentiometer R1 eingestellt. Dann dreht der Motor mit einer konstanten Drehzahl, die nur von der Frequenzstabilität abhängt. Der Strom liegt bei 350 mA mit 5V Spannung.

Hier sollte der Motor drehen, aber es geht auch andersrum. Wenn man die Motorwelle dreht, dann liefert er 3 um 120 Grad phasenverschobene Sinussignale, so wie ein Drehstromgenerator. Damit kann man Strom erzeugen, die Drehzahl messen oder auch einen Drehimpulsgeber bauen.

Ein neues Leben für einen alten Harddisk-Motor.

Literatur: Datasheet ATtiny13, Atmel.com

Download: HDMot3.zip
'***************************************************************************
'
'ATTiny13 HD motor controller
'
' 3 phased pulse outputs PB0..2
' potentiometer on ADC3 to set frequency
'
'***************************************************************************
' This program is free software; you can redistribute it and/or
' modify it under the terms of the GNU General Public License.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY;
'***************************************************************************
'
'***************************************************************************
'
' Pinout ATtiny13/ATtiny13V 8-PDIP/SOIC
'
' (PCINT5/RESET/ADC0/dW) PB5 VCC
' (PCINT3/CLKI/ADC3) PB3 PB2 (SCK/ADC1/T0/PCINT2)
' (PCINT4/ADC2) PB4 PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
' GND PB0 (MOSI/AIN0/OC0A/PCINT0)
'
'***************************************************************************
' PB0 output
' PB1 output
' PB2 output
' PB4 output
' PB3 input ADC channel 3
'***************************************************************************

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 8
$framesize = 4

Const C_value = 46 - 1 ' Compare Match IRQ 10 ms start

Ipulse Alias Portb.4

Dim Voltage As Word
Dim Icnt As Byte , Phase As Byte

Portb = &B00000000
Ddrb = &B00010111

Acsr.acd = 0 ' switch off analog comparator

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Didr0.adc3d = 1
Start Adc

Config Timer0 = Timer , Prescale = 256
Ocr0a = C_value ' value for 1.2 MHz
Tccr0a = &B00000010 ' ctc
Timsk0.ocie0a = 1
On Oc0a Tim0_compa
Start Timer0

Enable Interrupts


Do 'main loop

Loop


'***************************************************************************
'Tim0_compa Interrupt 54..0,4 ms
'***************************************************************************

Tim0_compa: '

Ipulse = 1
Incr Icnt
Voltage = Getadc(3)
Shift Voltage , Right , 2 '8 bit
If Voltage > 252 Then
Voltage = 252
End If
If Voltage < 2 Then 'limit
Voltage = 2
End If
Ipulse = 0
Ocr0a = Voltage 'set frequency

Select Case Icnt
Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000010
Case 3 : Portb = &B00000100
Icnt = 0
End Select

Return

End
                              


 Elektronik-Labor   Projekte   AVR