Cantafford
Member
Hello,
I'm trying to control a bldc motor using PIC18f2431. For starters I just want to get it to spin. I want to simulate it in proteus and this is the schematic:
I want to use input capture modules cap1, cap2 and cap3 to detect the current status of the hall sensors and depending on what those values are send a specific sequence to the phases of the motor. CAP1, 2 and 3 are on RA2, RA3 and RA4.
Here is the truth table for the phase sequence:
In my code I want to use INPUT CAPTURE interrupt on every falling edge(of all cap's) to detect when the sensor changed state. When that happens generate an interrupt and read the whole capture inputs(1,2,3) pins to see what the current state of the hall sensors is and generate the phase sequence.
This is the code I wrote:
The main file:
And the header.h
When I compile this code the motor does not start at all in proteus. Hall sensors stay in: hall1-low, hall2-low, hall3-high and nothing changes.
Please help me correct this. Thank you for reading!
I'm trying to control a bldc motor using PIC18f2431. For starters I just want to get it to spin. I want to simulate it in proteus and this is the schematic:
I want to use input capture modules cap1, cap2 and cap3 to detect the current status of the hall sensors and depending on what those values are send a specific sequence to the phases of the motor. CAP1, 2 and 3 are on RA2, RA3 and RA4.
Here is the truth table for the phase sequence:
In my code I want to use INPUT CAPTURE interrupt on every falling edge(of all cap's) to detect when the sensor changed state. When that happens generate an interrupt and read the whole capture inputs(1,2,3) pins to see what the current state of the hall sensors is and generate the phase sequence.
This is the code I wrote:
The main file:
Code:
/*
* File: main.c
* Author: Paul
*
* Created on March 23, 2016, 5:27 PM
*/
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int HALL;
int HALLvalue[6] = { 0b00000101, 0b00000100, 0b00000110, 0b00000010, 0b00000011, 0b00000001 };
// Capture Interrupt Service Routine
void interrupt CheckHallValue()
{
IC1IF = 0; IC2QEIF = 0; IC3DRIF = 0;
HALL = PORTA >> 2 & 0b00000111; // read the capture pins to get hall sensor state
if(HALL == HALLvalue[0]) LATB = 0b11100100; // and give
else if(HALL == HALLvalue[1]) LATB = 0b11000110; // appropiate phase sequence
else if(HALL == HALLvalue[2]) LATB = 0b11010010;
else if(HALL == HALLvalue[3]) LATB = 0b11011000;
else if(HALL == HALLvalue[4]) LATB = 0b11001001;
else if(HALL == HALLvalue[5]) LATB = 0b11100001;
}
void main()
{
OSCCON = 0x7F; // frequency is 8Mhz
TRISA = 0b11111111; // PORTA is input(CAP's + POT)
GIE = 1; // enable global interrupts
// Initialize the Input Capture Module
CAP1CON = 0b00000000; // disable input capture 1 module
CAP1CON = 0b00001000; // enable input capture 1 module; interrupt on every state change
CAP2CON = 0b00000000; // disable input capture 2 module
CAP2CON = 0b00001000; // enable input capture 2 module; interrupt on every state change
CAP3CON = 0b00000000; // disable input capture 3 module
CAP3CON = 0b00001000; // enable input capture 3 module; interrupt on every state change
// Enable Capture Interrupt and configure TMR5
IC1IF = 0; // clear IC1 interrupt status flag
IC1IE = 1; // enable IC1 interrupt
IC2QEIF = 0; // clear IC2 interrupt status flag
IC2QEIE = 1; // enable IC2 interrupt
IC3DRIF = 0; // clear IC3 interrupt status flag
IC3DRIE = 1; // enable IC3 interrupt
T5SYNC = 0;
T5CON = 0b01011001;
}
And the header.h
Code:
/*
* File: header.h
* Author: Paul
*
* Created on March 23, 2016, 5:26 PM
*/
// PIC18F2431 Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG1H
#pragma config OSC = IRCIO // Oscillator Selection bits (Internal oscillator block, port function on RA6 and port function on RA7)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = ON // Internal External Oscillator Switchover bit (Internal External Switchover mode enabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled)
// BORV = No Setting
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
#pragma config WINEN = OFF // Watchdog Timer Window Enable bit (WDT window disabled)
// CONFIG3L
#pragma config PWMPIN = OFF // PWM output pins Reset state control (PWM outputs disabled upon Reset (default))
#pragma config LPOL = HIGH // Low-Side Transistors Polarity (PWM0, 2, 4 and 6 are active-high)
#pragma config HPOL = HIGH // High-Side Transistors Polarity (PWM1, 3, 5 and 7 are active-high)
#pragma config T1OSCMX = ON // Timer1 Oscillator MUX (Low-power Timer1 operation when microcontroller is in Sleep mode)
// CONFIG3H
#pragma config MCLRE = OFF // MCLR Pin Enable bit (Disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Low-Voltage ICSP Enable bit (Low-voltage ICSP enabled)
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-000FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (001000-001FFF) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (002000-002FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (003000-003FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-000FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (001000-001FFF) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (002000-002FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (003000-003FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-000FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (001000-001FFF) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (002000-002FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (003000-003FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from table reads executed in other blocks)
#define _XTAL_FREQ 8000000
When I compile this code the motor does not start at all in proteus. Hall sensors stay in: hall1-low, hall2-low, hall3-high and nothing changes.
Please help me correct this. Thank you for reading!
Last edited: