electronic automotive motor control system
DESCRIPTION
Electronic Automotive Motor Control System. Software Description. Viking 32. Kernel Selection and Task Design. Kernel – Micro C/OSII. Micro C/OSII was selected for its flexibility and OS services Queues Memory Partitions Mutual exclusions. Task/ISR Description. Task/ISR Specs. - PowerPoint PPT PresentationTRANSCRIPT
Electronic Automotive Motor Control System
Software Description
Viking 32
Kernel Selection and Task Design
• Kernel – Micro C/OSIIMicro C/OSII was selected for its flexibility and OS services1. Queues2. Memory Partitions3. Mutual exclusions
Task/ISR DescriptionTask and Discription Period Type
EctInCap0ISR – Measures time in between motor speed sensor pulses, 90 pulses per revolution. Sporadic
EctInCap1ISR – Measures time in between axle speed sensor pulses, 66 pulses per revolution. Sporadic
EctOverFlowISR – Handles counter wraparound for input captures above. Periodic
StartTask – Initializes all tasks listed below, Shifter Port, and Port A I/O Run Once
Can0BusTask – Initializes and monitors CAN bus Periodic
Can0RxTask – Receives and queues CAN frames Periodic
EctRpmTask – Measures and Calculates motor and axle RPMs Periodic
InputTask – Accumulates all input data from the sensors, then puts them into a queue Periodic
CalcDataTask – Reads from two input queues, calculates data for all outputs, outputs to UITask via three output queues
Periodic
UITask – Reads from three queues, writes data to SCI port using VT100. Continuous
Task/ISR Specs.# TASK / ISRs PRIORITY Period
Type Tp-ave Tp-pk Tex Lave Lpk
1 EctInCap0ISR ISR 0 Sporadic 55.56μs 27.78μs 3.08μs 0.055 0.111
2 EctInCap1ISR ISR 1 Sporadic 727.26μs 363.63μs 3.08μs 0.004 0.0085
3 EctOverFlowISR ISR 2 Periodic 2.72ms 2.72ms 6.53μs 0.0024 0.0024
4 StartTask 4 Run Once -- -- -- -- --
5 Can0BusTask 5 Periodic 100ms 100ms 10μs 0.0001 0.0001
6 Can0RxTask 6 Periodic 10ms 10ms 1.78μs 0.0002 0.0002
7 EctRpmTask 8 Periodic 10ms 10ms 39.2μs 0.004 0.004
8 InputTask 9 Periodic 50ms 50ms 131.2μs 0.0026 0.0026
9 CalcDataTask 10 Periodic 50ms 50ms 70μs 0.0014 0.0014
10 UITask 11 Continuous -- -- -- -- --
Total CPU Load 0.070 0.130
CAN Bus LoadSender Message Type Tframe period Tframe exec Lbus
UQM Inverter Elec Drive State Status 100ms 540μs 0.0054
UQM Inverter Elec Drive Temp Status 1000ms 540μs 0.00054
UQM Inverter Can Watch Dog Status 500ms 540μs 0.00108
EAMCS Torque/Speed Command 50ms 540μs 0.0108
Total Bus Load 0.0178
Modules and Descriptions• EAMCS – Main program. Integrates all modules listed below into motor
control system.
• AtoD – Initialization and analog to digital conversions.
• CAN – Initialization, Transmission, and Reception of data over the Controller Area Network.
• eamcs_display – Formats and updates data for the User Interface.
• BasicIO – Initializes the SCI port, formats, transmits, and receives ASCII data
• ECT – Handles input captures and RPM calculations.
• PWM – Initialization, sets pulse width modulation
EAMCS.c
Code Reuse: BasicIO Module
Modifications: Baud = 19200
Port = SCI1
TASKS:
StartTask
Can0BusTask
Can0RxTask
InputTask
CalcDataTask
UITask
AtoD.c
Public Functions:void AtoDInitSingle(void)INT16U AtoDReadSingle(INT8U port)
Code Reuse: None
CAN.cPublic Functions:INT8U Can0Enable(void);void Can0Timing(void);void Can0Filter(INT8U id_ac_mode, INT8U *filter1, INT8U *filter2)void Can0Mask(INT8U *mask1, INT8U *mask2)INT8U Can0Rx(CAN_DATA *rx_data)INT8U Can0Tx(CAN_DATA *tx_data)void Can0IdFormat(INT8U *can_id)
Code Reuse: None
INT8U Can0BusStatus(void)
void Can0BusOffReq(void)
void Can0TxRxReq(void)
void Can0SleepReq(void)
eamcs_display.cPublic Functionsvoid DispConditions(void)void DispAccelVolt(INT16U acc_volt)void DispBrakeVolt(INT16U brake_volt)void DispShiftPos(INT8U s_pos)void DispGearPos(INT16U g_pos)void DispMotorRpm(INT16U m_rpm_val)void DispAxleRpm(INT16U a_rpm_val)void DispFaultBit(INT8U fault_bit)void DispEnableBit(INT8U enable_bit)void DispReqGearPos(INT8U req_gear_pos)void DispCanMotorRpmRx(INT16U m_rpm_val)void DispCanTorqueRx(INT8U torque_val)void DispCanBusVoltRx(INT8U bus_volt_val)void DispCanBusCurrentRx(INT8U bus_cur_val)void DispCanInverterTempRx(INT8U temp_val)void DispCanRotorTempRx(INT8U rotor_val)void DispCanStatorTempRx(INT8U stator_val)void DispCanWatchDogRx(INT8U comm_err, INT8U wtch_dg_err)void DispCanReqSpeedTx(INT16U speed)void DispCanReqTorqueTx(INT8U torque)void DispCanPowerReqTx(INT8U power)void DispCanMaxBusCurTx(INT8U max_current)void DispCanMaxBusVoltTx(INT8U max_volt)void DispCanControlBitTx(INT8U control_bit)void DispCls(void)
Code Reuse: BasicIO Module
Modifications: Baud = 19200
Port = SCI1
ECT.cPublic Functionsextern void EctRpmTaskInit(void)INT8U EctGetRPM0(INT16U *period)INT8U EctGetRPM1(INT16U *period)
TasksEctRpmTask
ISRsISR EctInCap0ISR(void)ISR EctInCap1ISR(void)ISR EctOverFlowISR(void)
OS_EVENT *RpmMutexCode Reuse: None
PWM.c
Public Functionsvoid PwmInit100kHz(INT8U port, INT8U duty_cycle)void PwmDutyCycle(INT8U duty_cycle)INT8U PwmGetDutyCycle(void)
Code Reuse: None
InputTask
CalcDataTask
50ms
UITask
CanRxTask
Intertask CommunicationsPartitioned Memory Flow
UiCanTxQueue
UiCanRxQueue
UiSensorDataQ
CanRxDataQ
SensorDataQ
Heap
50ms
10ms
Continuous
Memory Partition
Sensor Data
CAN RX Data
CAN TX Data
InputTask
CalcDataTask
50ms
UITask
CanRxTask
Intertask CommunicationsPartitioned Memory Flow
UiCanTxQueue
UiCanRxQueue
UiSensorDataQ
CanRxDataQ
SensorDataQ
Heap
50ms
10ms
Continuous
Memory Partition
Sensor Data
CAN RX Data
CAN TX Data
OSQPost()
OSQPost()
OSQPost()
OSQPost()
OSQPost()
OSMemGet()
OSMemPut()
OSMemPut()
OSQAccept()
OSQAccept()
OSQAccept()
OSQAccept()
OSQAccept()
RXCAN0
TXCAN0CAN0 Controller
CAN Module
250kbps
TXCAN BUFFERS
Can0Enable()Can0Filter()Can0Mask()Can0IdFormat()
Can0Tx()
Can0Timing()
RXCAN BUFFERS Can0Rx()
Can0SleepReq()Can0TxRxReq()Can0BusOffReq()Can0BusStatus()
Can0BusTask
Intertask Communications
InputTask
AN0-2
AN00
AN01
AN02
A to D Module0.5µs
ATDDR0
ATDDR1
ATDDR2
AtoDReadSingle()
AtoDInitSingle()
EctGetRPM1()
EctGetRPM0()
RpmTask
PT00
PT01
ECT Module
10ms
Rpm0
Rpm1
EctInCap0ISR
EctInCap1ISR
EctOverFlowISR
OverFlowCnt0
PeriodCnt0
OverFlowCnt1
PeriodCnt1
EctRpmTaskInit()
Shifter PortPK0_L
PK1_L
PK2_L
PK3_L
PK4_L
PK5_L
SHIFTER_POSITION()(~(SHIFTER_PORT | 0xc0))
SHIFTER_PORT_INIT()
PORT A PA2_L
GEAR_SEL_FAULT()
Intertask Communications
Can0RxTask
CalcDataTask
CanRxDataQ
PwmInit100kHz()
PWM Module
PwmGetDutyCycle()
PwmDutyCycle()
PWM0 PWM 8B8C
Duty Cycle
PORT A
PK0_L
PA3_L
GEAR_SEL_ENABLE()
Intertask Communications
RXCAN0
TXCAN0
CAN0 Controller
CAN Module
250kbps
TXCAN BUFFERS
Can0Enable()Can0Filter()Can0Mask()Can0IdFormat()
Can0Tx()
Can0Timing()
RXCAN BUFFERS Can0Rx()
Can0SleepReq()Can0TxRxReq()Can0BusOffReq()Can0BusStatus()
UITask
UiCanTxQueue
UiCanRxQueue
UiSensorDataQ
Continuous
TXD1
RXD1
BasicIOModule
eamcs_display ModuleDispConditions()DispAccelVolt()DispBrakeVolt()
DispShiftPos()DispGearPos()
DispMotorRpm()DispAxleRpm()
DispFaultBit()DispEnableBit()
DispReqGearPos()DispCanMotorRpmRx()
DispCanTorqueRx()DispCanBusVoltRx()
DispCanBusCurrentRx()DispCanInverterTempRx()
DispCanRotorTempRx()DispCanStatorTempRx()
DispCanWatchDogRx()DispCanReqSpeedTx()DispCanReqTorqueTx()DispCanPowerReqTx()
DispCanMaxBusCurTx()DispCanMaxBusVoltTx()
DispCanControlBitTx()DispCls()
Intertask Communications