Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Servo problems

Status
Not open for further replies.

bananasiong

New Member
Hi,
I've just started to learn using a servo motor yesterday. I bought a second hand servo from my senior, which has been modified to 360.
https://www.trossenrobotics.com/store/p/3289-Hitec-Servo-HS322.aspx
I couldn't find the datasheet of it.
After researching, I found that the pulse given to the servo is from 1 ms to 2 ms and it is being updated every 20 ms. So I come out with this program:
Code:
	LIST	P=16F88
	#include <P16F88.inc>
	errorlevel -302
	__config	_CONFIG1,	0x3f50
	__config	_CONFIG2,	0x3fff

	cblock	0x20
		count1
		counta
		countb
		offcount

	endc

	org	0x0000
	goto	Initialize

Initialize
	bsf		STATUS,	RP0
	movlw	0x07
	movwf	CMCON
	clrf	ANSEL
	movlw	0x6e			;4 MHz, 1 us instruction cycle.
	movwf	OSCCON
	movlw	b'00011100'
	movwf	TRISA
	clrf	TRISB
	bcf		STATUS,	RP0
	clrf	PORTA
	clrf	PORTB

Start
	btfsc	PORTA,	2
	call	One25
	btfsc	PORTA,	3
	call	One50
	btfsc	PORTA,	4
	call	One75
	call	Delay50
	goto	Start

One25
;	movlw	.156			;1.25ms
	movlw	.150
	movwf	offcount
	bsf		PORTB,	4
	call	DelayW
	call	Off
	return

One50
;	movlw	.187			;1.5ms
	movlw	.176			;1.408ms, servo not moving
	movwf	offcount
	bsf		PORTB,	4
	call	DelayW
	call	Off
	return

One75
;	movlw	.219			;1.75ms
	movlw	.200
	movwf	offcount
	bsf		PORTB,	4
	call	DelayW
	call	Off
	return

Off
	movf	offcount,	w	;2 ms - on time + 18 ms = total off time
	sublw	.250
	bcf		PORTB,	4
	call	DelayW
	call	Delay18
	return

;W 8 instruction cycle routine from Pommie.
DelayW
; will delay W*8 cycles including the call/return
		addlw	0xff;		add -1 to W			1
		btfsc	STATUS,Z;	=zero?				1/2
		goto	DoneDelay;	yes, better get out of here	2
		nop;			delay a bit			1
		goto	$+1;		delay a bit more		2
		goto	DelayW;		go around again			2
DoneDelay
		return	;						2


Delay50	movlw	.50		;delay 50 ms (4 MHz clock)
		goto	d0
Delay18	movlw	.18
		goto	d0
d0		movwf	count1
d1		movlw	0xC7			;delay 1mS
		movwf	counta
		movlw	0x01
		movwf	countb
Delay_0
		decfsz	counta, f
		goto	$+2
		decfsz	countb, f
		goto	Delay_0

		decfsz	count1	,f
		goto	d1
		return

	end
There are basically 3 switches, clockwise, counter clockwise and not moving. As I know, 1.5 ms pulse is neutral where the servo will not be moving but it turned. After some testing, I found that the neutral pulse width is 1.408 ms. There are a few questions:
1. Sometimes 1.408 ms pulse width the motor stops, sometimes it moves with very very low resolution.
2. Somehow I still couldn't figure out how much the pulse width represent how much the resolution, in degree. But I found that the turning angle for 1 pulse given won't be increased even I reduce the pulse width somewhere less than 1 ms. But I couldn't manage to get the exact value by just looking at it.
3. Sometimes when the motor is rotating counter clockwise for example, if there is any shaking to the motor, it turns clockwise for a while (less than 1 second) then turn back to counter clockwise. I'm sure that there is no connection problem. Is that the faulty of the motor?
4. When I turn off and on the supply every time, the servo turns a bit, then turns back. But sometimes it never turn back.

Thanks
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top