![]() | ![]() | ![]() |
| | |||||||
| Electronic Projects Design/Ideas/Reviews Are you building an electronic project or want to? Maybe you need some assistance? Come and submit your electronic questions here and let our experienced members find a solution. |
| | Thread Tools | Display Modes |
| | (permalink) |
| Experienced Member | Hi all, Could anyone review the code i have written ?. This is written in PIC C to control a lm629 motioncontol IC. I have also included a schematic of my circuit . Could any one review the circuit for errors . Please find the following links that i've used to help me in my design . Thanks a ton for your time and effort. 1. LM 629 data sheet 2. LM 629 programming guide 3. LM 629 User guide 4. LMD 18200 data sheet 5. PIC 16 F 877 data sheet Here is the code : Code: // **** Kindly maximize the screen , (c) D.Ajay kumar , March , 2005 ****
//
// This Program is written in PIC C to interface a PIC16F877 to a LM629 , The program is expected to execute the following
// operation ," Independent of the current resting position of the motor shaft , the shaft will complete thirty revolutions
// in the reverse direction . Total time for the move is fifteen seconds. Total time for accn and deceleration is five secs"
// ** ---- This system uses a 2500 cpr encoder ---- **
// Total counts for this position 2500 cpr x 4 counts/cycle = 10000 counts / rev.
// 10000 x 30 rev = 300000 counts
// 300000/5 = 60000 counts during acceleration and deceleration
// 60000/2 = 30000 counts during acceleration
// Sample perion of system = 2048 x (1/6x10e6) = 341 x 10e-6 seconds/sample. ---- note : 6 MHz clock ----
// The number of samples during accn. (and deceleration) = 2.5 secs / (341x10e-6) = 7332 samples during accn/ decleration.
// s=ut + 1/2 at^2
// a=2s/t^2 = (2 x 30000 counts) / (7332 samples)^2 = 0.00111 counts / sample^2
// Total counts travelled at max velocity is 4/5th of total counts travelled
// (4x 300000)/5 = 240000 counts.
// Number of samples at maximum velocity 10 seconds / (341 x 10e-6) = 29325 samples.
// Using counts/sample velocity is found : 240000/29325 = 8.184 counts / sample.
// Scale acceleration values: 0.00111 x 65536 = 72.744 counts /sample^2
// Scale velocity values : 8.184 x 65536 = 536346.624 counts/sample.
// Round values to the nearest integer:
// Acceleration = 73 = 00 00 00 49 hex counts/sample ^2 ----------------------------------------------(1)
// Velocity = 536347 = 00 08 2F 1B hex counts/sample ----------------------------------------------(2)
// Position =-300000 = FF FB 6C 20 hex counts ----------------------------------------------(3)
#include "C:\pic\Examples\motorfin.h"
#byte TRISB=0x86 // Initialize PORTB
#byte TRISD=0x88 // Initialize PORT D
#byte PORTB=0x06 // Set up PORT B
#byte portd=0x08 // Set up PORT D
#bit rst=0x08.7 // Define RESET pin to PORT B7
#bit ps=0x08.6 // Define Port Select to PORT B6
#bit wr=0x08.5 // Define Write to PORT B5
#bit rd=0x08.4 // Define Read to PORT B4
#bit RB0=0x06.0 // Define RB0 (busy-bit pin)
void init_mod(void);
void filter_mod(void);
void busy_bit(void);
void status_check(void);
void out_c(short);
void out_d(short);
int sw;
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
while(1)
{
TRISD=0x00; // Set PORT D as INPUT
init_mod(); // Call Initialize function
filter_mod(); // Call Filter function
out_c(0x1f); // Call out_command module and load the trajectory parameters input buffers
busy_bit(); // Call busy bit check module
out_d(0x00); // Call out data module and output HB of trajectory control word
out_d(0x2b); // All three parameters (pos,vel,acc) will be loaded and all are relative
busy_bit(); // Call busy bit check module
out_d(0x00); // Accn. data HIGH word HB, refer note ......(1)
out_d(0x00); // Accn. data HIGH word LB
busy_bit(); // Call busy bit check module
out_d(0x00); // Accn data LOW word HB
out_d(0x49); // Accn data LOW word LB
busy_bit(); // Call busy bit check module
out_d(0x00); // Vel. HIGH word HB, refer note ............(2)
out_d(0x08); // Vel. HIGH word LB
busy_bit(); // Call busy bit check module
out_d(0x2f); // Vel. LOW word HB
out_d(0x1b); // vel. LOW word LB
busy_bit(); // Call busy bit check module
out_d(0xff); // Pos. HIGH word HB, refer note ............(3)
out_d(0xfb); // Pos. HIGH word LB
busy_bit(); // Call busy bit check module
out_d(0x6c); // Pos. LOW word HB
out_d(0x20); // Pos. LOW word LB
busy_bit(); // Call busy bit check module
out_c(0x01); // STT issued to execute trajectory
}
}
// ** BUSY BIT CHECK MODULE ** //
busy_bit()
{
// ** CS pin is permanently grounded (Low) **
TRISB=0xff; // Set PORT B as OUTPUT
portd = 0xFF; // Output '11111111' on PORT D
ps=0; // Set PS=0
rd=0; // Set RD=0
while(RB0); // Wait till Busy_bit pin is set (RB0)
ps=1; // Set PS=1
rd=1; // Set RD=1
portd = 0xFF; // Output '00000000' on PORT D
}
// ** INITIALIZATION MODULE ** //
init_mod()
{
portd = 0xFF;
begin: // Label
rst=0b0; // Set Reset Low
delay_ms(1); // Call Delay 1 ms.
rst=0b1; // Set Reset High
delay_ms(3); // Call Delay 3 ms.
status_check(); // Call Status Check function
// Check if Status Word is hex 'c4' or '84'
if(!(sw==0xc4 || sw==0x84)) goto begin;
else
{
out_c(0x1d); // Tells which Interrupts to reset as indicated by zero's in the next data word
busy_bit(); // Call busy bit check module
out_d(0x00); // Don't Care data.
out_d(0x00); // All interrupts will be reset
busy_bit(); // Call busy bit check module
status_check(); // Call Status Check function
// Check if status word is hex 'c0' or '80'
if(!(sw==0xc0||sw==0x80))
goto begin;
busy_bit(); // Call busy bit check module
}
portd = 0xFF; // Output '11111111' on PORT D
}
// ** FILTER PROGRAMMING MODULE ** //
void filter_mod(void)
{
out_c(0x1e); // LFIL command - initiates loading filter co-efficients.
busy_bit(); // Call busy bit check module
out_d(0x00); // Filter control word , indicates which values Kp,Ki,Kd,Il will be loaded
out_d(0x0e); // selects that kp,ki,kd values will be loaded
busy_bit(); // Call busy bit check module
out_d(0x00); // kp values 8 bit HB
out_d(0x0a); // LB
busy_bit(); // Call busy bit check module
out_d(0x00); // ki values 8 bit HB
out_d(0x00); // LB
busy_bit(); // Call busy bit check module
out_d(0x00); // kd values 8 bit HB
out_d(0x00); // LB
busy_bit(); // Call busy bit check module
out_c(0x04); // Transfer new filter co-efficients to Working register
busy_bit(); // Call busy bit check module
}
// ** DATA OUT FUNCTION ** //
out_d(int dat)
{
TRISB=0xff; // Set PORT B as outputs
portd = 0xFF; // Output '11111111' on PORT D
ps=1; // Set PS high
rd=1; // Set RD high
wr=0; // Set WR low
PORTB=dat; // Output 'dat' on PORT B
wr=1; // Set WR high for sending next byte
portd = 0xFF; // Output '11111111' on PORT D
}
// ** COMMAND OUT FUNCTION **//
out_c(int com)
{
TRISB=0xff; // Set PORT B as outputs
portd = 0xFF; // Output '11111111' on PORT D
ps=0; // Set PS low
wr=0; // Set WR low
rd=1; // Set RD high
PORTB=com; // Output 'com' on PORT B
wr=1; // Set WR high for sending next byte
portd = 0xFF; // Output '11111111' on PORT D
}
// ** STATUS CHECK FUNCTION ** //
status_check()
{
TRISB=0xff; // Set PORT B as outputs
portd = 0xFF; // Set PORT D as outputs
ps=0; // Set PS low
rd=0; // Set RD low
wr=1; // Set WR high
delay_ms(1); // Call Delay for 1 ms
sw=PORTB; // Store PORTB value in 'sw'
rd=1; // Set RD high
portd = 0xFF; // Output '11111111' on PORT D
} Please clink on this link for circuit schematic Thanks for looking , Regards
__________________ the best bet yet... |
| | |
| | (permalink) |
| Experienced Member | hi all, every one seems to have ignored this , please help !!!!! thanks& regards
__________________ the best bet yet... |
| | |
| | (permalink) |
| Experienced Member | What exactly are we looking at/for? Have you built the circuit and tested it yet? What were the results? Have you simulated the C code? What were the results? Tell us what's happening here and then we can begin narrowing down what the problem might be... and the link to your circuit isn't working for me. is it a picture? try attaching it to a post. |
| | |
| | (permalink) |
| Super Moderator | Yes, this isn't a 'free design service', try designing your program! - break it down into individual parts and test and debug each part on it's own - basic software design principles!. |
| | |
| | (permalink) |
| Experienced Member | Hi all, I am sorry if I offended you guys . But ,the problem here is that I have sucessfully run the program in MPLAB"s simulator .The program seems to be fine there but it does not seem to work in the circuit . I just wanted to know , if the timing , handshakes were okay . I understand that this could be tedious for someone who hasn't worked with the LM629 but it would be easy for someone who has done this before . I took the liberty of making some assumptions while designing the ciruit . I just wanted to know if they were right . Thanks and sorry again
__________________ the best bet yet... |
| | |
| | (permalink) |
| Experienced Member | Hi all, I think i forgot to attach the schematic
__________________ the best bet yet... |
| | |
| | (permalink) |
| Experienced Member | I'm still not seeing the schematic... |
| | |
| | (permalink) |
| Experienced Member | is it a 1 april joke? I see two identical schematics
__________________ Il give you shocking experience. |
| | |
| | (permalink) | |
| Experienced Member | Quote:
| |
| | |