|
|
View previous topic :: View next topic |
Author |
Message |
franklin_
Joined: 23 Mar 2011 Posts: 2 Location: Mexico
|
Problems with pulse steering control pic16f887 |
Posted: Wed Mar 23, 2011 8:23 pm |
|
|
Hello everybody, I'm a novice in the world of pics programming, so I'm having some troubles.
lets go to the problem
I have 2 DC motors that I want to control its rotation depending on what input enters to a pin. I'm trying to do it with pulse steering control from ECCP module, but I don't understand how it works the pulse steering control. Now what I want its that when the inputs in pin B7 be 0 logical, the motors must turn to same direction simultaneusly, and when the inputs in pin B7 be a 1 logical, one motor still turns to the same direction and the other turns in opposite direction, and when appear a 0 logical, once more the two turns to the same direction; I'm doing my code helping myself from others codes but I don't really understand what I'm doing wrong; I've already the datasheet of pic but it's not clear yet for me. Please could someone help and tell me what I'm doing wrong???
The CCP2 module is simulating an input of 1's and ' 0's depending on if switch is closed or opened.
This is my code:
Code: |
#include <16F887.H>
#device adc=8
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 8000000)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#define P1A PIN_C1
#define P1B PIN_D5
#define P1C PIN_D6
#define P1D PIN_D7
#byte PSTRCON = 0x9d
int8 adelante;
void set_pulse_steering(int32 steering)
{
int8 temp;
temp = make8(steering, 3); // Get high byte only
PSTRCON = temp; // Setup PWM steering register
// Set the TRIS to outputs for the enabled steering pins.
// Also set the selected pins to a low level.
if(temp & 1)
output_high(P1A);
if(temp & 2)
output_high(P1B);
if(temp & 4)
output_high(P1C);
if(temp & 8)
output_high(P1D);
}
void main()
{
set_tris_B(0xFF); //todos son entradas
set_tris_C(0xF9); //los pines RC1 y RC2 son salidas
set_tris_D(0xE0); //los pines RD5, RD6 y RD7 son salidas
port_b_pullups(0x00);
adelante=128;
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(adelante);
setup_ccp2(adelante);
setup_ccp1(CCP_PWM_H_H);
output_low(P1B);
output_low(P1C);
output_low(P1D);
while(1)
{
if(input(PIN_B7)==0);
{
while(input(PIN_B7)==0);
{
set_pulse_steering(CCP_PULSE_STEERING_B | CCP_PULSE_STEERING_D);
}
}
if(input(PIN_B7)==1)
{
set_pulse_steering(CCP_PULSE_STEERING_C);
while(input(PIN_B7)==1)
{
set_pulse_steering(CCP_PULSE_STEERING_C);
}
}
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Mar 24, 2011 2:24 pm |
|
|
Pulse steering allows you to send the output pulses from one CCP channel
out on any of 4 different i/o pins, in any combination. But it's the same
signal on all the selected pins.
If you want to run a motor in forward and reverse, the normal method
is to use an H-Bridge driver. Read this tutorial on DC Motor control
from Microchip:
http://ww1.microchip.com/downloads/en/devicedoc/41233a.pdf
You can find more appnotes like that by searching for the following
search string with Google:
Quote: | site:microchip.com DC motor control -forums |
|
|
|
franklin_
Joined: 23 Mar 2011 Posts: 2 Location: Mexico
|
|
Posted: Sat Mar 26, 2011 2:40 pm |
|
|
ok, many thanks, I haven't read that document yet, but I achieved to make a semi control with the direction of motors, but my code it's still wrong, the idea is when the pic receives a 0 in PIN_B0, the first pwm signal comes off for P1A, and the other pwm signal must comes off for P1C, and when the pic receives a 1 in the same pin, motors should stop for a while, and then the P1A should send the same pwm signal but now P1D should be active and sending pwm signal instead P1C, but is not so, what am I doing wrong???
I post my code for suggestions
Code: |
#include <16F887.H>
#device adc=8
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#define P1A PIN_C1
#define P1B PIN_D5
#define P1C PIN_D6
#define P1D PIN_D7
#byte CCP1CON = 0x17
#byte PSTRCON = 0x9D
int8 adelante;
void main()
{
set_tris_B(0b10111111); //todos son entradas excepto B7
set_tris_C(0b11111001); //los pines RC1 y RC2 son salidas
set_tris_D(0b00011111); //los pines RD5, RD6 y RD7 son salidas
port_b_pullups(0b11111110);
setup_adc_ports(NO_ANALOGS);
adelante=127;
output_high(PIN_B1);
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(adelante);
CCP1CON=0b00001100;
output_low(P1A);
output_low(P1B);
output_low(P1C);
output_low(P1D);
while(TRUE)
{
if(input_state(PIN_B0)==0) //here receives a 0 logical and evaluates the state of pin
{
while(input_state(PIN_B0)==0) //still doing the same action till receives 0 no more
{
PSTRCON=0b00000101;
}
PSTRCON=0b00000000;
output_low(P1A);
output_low(P1C);
delay_ms(2000);
}
if(input_state(PIN_B0)==1) // the same of previous but now receiving a 1 logical
{
while(input_state(PIN_B0)==1)
{
PSTRCON=0b00001001;
}
PSTRCON=0b00000000;
output_low(P1A);
output_low(P1D);
}
}
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|