Commit bc5a946a authored by Jake Read's avatar Jake Read

barebones commutating v031

parent 53aa4f21
......@@ -40,7 +40,7 @@ Loc="0 0 1919 1016"
State=1
Number=2
File="mkbldcdriver.sch"
View="-127.358 -108.213 75.6708 -31.4319"
View="-133.101 -16.4054 69.9278 60.3757"
WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
......@@ -79,7 +79,7 @@ ArcDirection=0
AddLevel=2
PadsSameType=0
Layer=91
Views=" 1: -127.358 -108.213 75.6708 -31.4319"
Views=" 1: -133.101 -16.4054 69.9278 60.3757"
Sheet="1"
[Win_2]
......@@ -88,7 +88,7 @@ Loc="0 0 1919 1016"
State=1
Number=1
File="mkbldcdriver.brd"
View="10.5389 56.9239 37.1626 57.7509"
View="13.5716 56.9498 32.0603 57.5241"
WireWidths=" 0.0762 0.1016 0.127 0.15 0.508 0.6096 0.8128 2.54 1.016 1.27 0.3048 0.254 0.2 0.4064 0.2032 0.1524"
PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
PadDrills=" 0.2 0.25 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6 0.3"
......
......@@ -502,3 +502,18 @@ int main(void)
![atsamd51 spi](https://gitlab.cba.mit.edu/jakeread/mkbldcdriver/raw/master/images/programming-spi-alive-atsamd51.png)
Now we do v0.31 board, new step board, etc. Go team, big day.
# Waking up v0.31
![pwm-one-channel](https://gitlab.cba.mit.edu/jakeread/mkbldcdriver/raw/master/images/programming-spi-atsamd51-as5147.png)
Have this SPI running with the encoder in-line and PWM still setup.
I integrated UART / Ringbuffers etc from the mkstepper project. So I have everything I need to start commutating.
OK!
## Commutating
Properly, I should do this on a timer. I'm going to do it in the while() loop for now, just to check that I'm having the output on the PWMs that I want.
......@@ -24,4 +24,13 @@ ringbuffer_t up2_rbtx;
uartport_t up1;
uartport_t up2;
spiport_t spi_encoder;
pin_t en_gate;
pin_t m_pwm;
pin_t dc_cal;
pin_t m_gain;
pin_t fault;
pin_t octw;
#endif /* HARDWARE_H_ */
\ No newline at end of file
......@@ -9,16 +9,32 @@
#include "sam.h"
#include "pwm_foc.h"
#include "pin.h"
#include "ringbuffer.h"
#include "uartport.h"
#include "spiport.h"
#include "hardware.h"
#include "sinelut.h"
#include <stdio.h>
// stlb is PA23
uint32_t encoder_read(void){
uint8_t data_tx[2] = {0xFF, 0xFF}; // read command: 1s, noop: 0s
uint8_t data_rx[2];
spi_txrxchars_polled(&spi_encoder, data_tx, 2, data_rx);
data_tx[0] = 0x00;
data_tx[1] = 0x00;
spi_txrxchars_polled(&spi_encoder, data_tx, 2, data_rx);
uint32_t data = (data_rx[0] & 0b00111111) << 8 | data_rx[1];
return data;
}
int main(void)
{
/* Initialize the SAM system */
SystemInit();
SysTick_Config(5000000);
SysTick_Config(2500000);
// LED
stlb = pin_new(&PORT->Group[0], 23);
......@@ -49,25 +65,118 @@ int main(void)
MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5;
uart_init(&up2, 7, SERCOM5_GCLK_ID_CORE, 63018);
// AS5147 SPI
// SERCOM0
// MISO: SER0, PA4
// SCK: SER1, PA5
// CSN: SER2, PA6
// MOSI: SER3, PA7
// AS5147 is CPOL = 0, CPHA = 1, 16 bit words (use 1 32 bit word, 2nd half will be reply: has to load)
spi_encoder = spi_new(SERCOM0, &PORT->Group[0], 4, 7, 5, 6, HARDWARE_IS_APBA, HARDWARE_ON_PERIPHERAL_D);
MCLK->APBAMASK.reg |= MCLK_APBAMASK_SERCOM0;
spi_init(&spi_encoder, 8, SERCOM0_GCLK_ID_CORE, 6, 0, 2, 0, 1, 0, 0);
// check all PWM lines
// pins for enable, fault, pwmmode, etc
pwmsetup_foc();
// integrate SPI, test AS5147, library
// DRV Outputs
// EN_GATE PA19: high to drive gates
// M_PWM PA20: drive low for 6 channel pwm, high for 3 channel
// DC_CAL PB16: drive high to calibrate
// M_GAIN PB17: drive low, gain = 10, high, gain + 40
en_gate = pin_new(&PORT->Group[0], 19);
pin_output(&en_gate);
pin_clear(&en_gate);
m_pwm = pin_new(&PORT->Group[0], 20);
pin_output(&m_pwm);
pin_clear(&m_pwm);
dc_cal = pin_new(&PORT->Group[1], 16);
pin_output(&dc_cal);
pin_clear(&dc_cal);
m_gain = pin_new(&PORT->Group[1], 17);
pin_output(&m_gain);
pin_clear(&m_gain);
// DRV Inputs
// FAULT PA21: input, open drain when active, use pullup
// OCTW PA22: input, open drain when active, use pullup
fault = pin_new(&PORT->Group[0], 21);
pin_input(&fault);
octw = pin_new(&PORT->Group[0], 22);
pin_input(&octw);
// do closed loop sinucommutate, following old ATSAMS70 code
// do BLDC closed, open loop
pwmsetup_foc();
// enable or don't
//pin_clear(&en_gate);
pin_set(&en_gate);
// other modes
pin_clear(&m_pwm);
pin_clear(&m_gain);
pin_clear(&dc_cal);
uint32_t resolution = 16384;
uint32_t modulo = 2340;
uint32_t offset = 800;
uint32_t reverse = 1;
uint32_t scalar = 42; // of 255
uint32_t reading;
uint32_t elecpos;
uint32_t phaseu, pwmu;
uint32_t phasev, pwmv;
uint32_t phasew, pwmw;
while (1)
{
pwmupdate_foc(126,126,126);
// read encoder & get electric position (relative phase period, not rotation period)
reading = encoder_read();
if(reverse){
reading = resolution - reading;
}
elecpos = (reading + offset) % modulo;
// not LUT'd yet
phaseu = elecpos / (modulo / 1024);
phasev = elecpos / (modulo / 1024) + 341;
phasew = elecpos / (modulo / 1024) + 682;
(phaseu > 1023) ? (phaseu -= 1023) : (0);
(phasev > 1023) ? (phasev -= 1023) : (0);
(phasew > 1023) ? (phasew -= 1023) : (0);
pwmu = sinelut[phaseu] * scalar / 255 + 1;
pwmv = sinelut[phasev] * scalar / 255 + 1;
pwmw = sinelut[phasew] * scalar / 255 + 1;
pwmupdate_foc(pwmu,pwmv,pwmw);
}
}
// ok, we're commutating
/*
- ticking: it's a PWM update error, occasionally setting some values to 100%
- implement a timer to commutate at a set frequency
- work through the mess of values above, go faster, cleaner
- basic search for reverse, offset, modulo etc would be cool, hard (probably)
- verify all gates are opening
*/
uint8_t loopcnt;
void SysTick_Handler(void){
pin_toggle(&stlb);
uart_sendchar_buffered(&up1, 125);
loopcnt ++;
uart_sendchar_buffered(&up1, loopcnt);
uint32_t reading = encoder_read();
uint8_t d1 = reading >> 8;
uint8_t d2 = reading;
uart_sendchar_buffered(&up1, d1);
uart_sendchar_buffered(&up1, d2);
}
void SERCOM4_0_Handler(void){
......
......@@ -189,6 +189,9 @@
<Compile Include="ringbuffer.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="sinelut.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="spiport.c">
<SubType>compile</SubType>
</Compile>
......
/*
* sinelut.h
*
* Created: 11/27/2017 1:32:38 PM
* Author: Jake
*/
#ifndef SINELUT_H_
#define SINELUT_H_
/*
takes 0 - 1023 phase position and returns sin from 0 - 255
*/
uint32_t sinelut[1024] = {
128,128,129,130,131,131,132,133,
134,135,135,136,137,138,138,139,
140,141,142,142,143,144,145,145,
146,147,148,149,149,150,151,152,
152,153,154,155,155,156,157,158,
159,159,160,161,162,162,163,164,
165,165,166,167,168,168,169,170,
170,171,172,173,173,174,175,176,
176,177,178,178,179,180,181,181,
182,183,183,184,185,186,186,187,
188,188,189,190,190,191,192,192,
193,194,194,195,196,196,197,198,
198,199,200,200,201,202,202,203,
204,204,205,205,206,207,207,208,
208,209,210,210,211,211,212,213,
213,214,214,215,215,216,217,217,
218,218,219,219,220,220,221,222,
222,223,223,224,224,225,225,226,
226,227,227,228,228,229,229,230,
230,230,231,231,232,232,233,233,
234,234,234,235,235,236,236,237,
237,237,238,238,239,239,239,240,
240,240,241,241,241,242,242,242,
243,243,243,244,244,244,245,245,
245,246,246,246,247,247,247,247,
248,248,248,248,249,249,249,249,
250,250,250,250,250,251,251,251,
251,251,252,252,252,252,252,252,
253,253,253,253,253,253,253,254,
254,254,254,254,254,254,254,254,
254,254,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,254,
254,254,254,254,254,254,254,254,
254,253,253,253,253,253,253,253,
253,252,252,252,252,252,251,251,
251,251,251,251,250,250,250,250,
249,249,249,249,248,248,248,248,
247,247,247,247,246,246,246,245,
245,245,245,244,244,244,243,243,
243,242,242,242,241,241,241,240,
240,239,239,239,238,238,238,237,
237,236,236,235,235,235,234,234,
233,233,232,232,232,231,231,230,
230,229,229,228,228,227,227,226,
226,225,225,224,224,223,223,222,
222,221,221,220,220,219,219,218,
217,217,216,216,215,215,214,213,
213,212,212,211,211,210,209,209,
208,208,207,206,206,205,204,204,
203,203,202,201,201,200,199,199,
198,197,197,196,195,195,194,193,
193,192,191,191,190,189,189,188,
187,187,186,185,185,184,183,182,
182,181,180,180,179,178,177,177,
176,175,175,174,173,172,172,171,
170,169,169,168,167,166,166,165,
164,163,163,162,161,160,160,159,
158,157,157,156,155,154,154,153,
152,151,150,150,149,148,147,147,
146,145,144,144,143,142,141,140,
140,139,138,137,136,136,135,134,
133,133,132,131,130,129,129,128,
127,126,126,125,124,123,122,122,
121,120,119,119,118,117,116,115,
115,114,113,112,111,111,110,109,
108,108,107,106,105,105,104,103,
102,101,101,100,99,98,98,97,
96,95,95,94,93,92,92,91,
90,89,89,88,87,86,86,85,
84,83,83,82,81,80,80,79,
78,78,77,76,75,75,74,73,
73,72,71,70,70,69,68,68,
67,66,66,65,64,64,63,62,
62,61,60,60,59,58,58,57,
56,56,55,54,54,53,52,52,
51,51,50,49,49,48,47,47,
46,46,45,44,44,43,43,42,
42,41,40,40,39,39,38,38,
37,36,36,35,35,34,34,33,
33,32,32,31,31,30,30,29,
29,28,28,27,27,26,26,25,
25,24,24,23,23,23,22,22,
21,21,20,20,20,19,19,18,
18,17,17,17,16,16,16,15,
15,14,14,14,13,13,13,12,
12,12,11,11,11,10,10,10,
10,9,9,9,8,8,8,8,
7,7,7,7,6,6,6,6,
5,5,5,5,4,4,4,4,
4,4,3,3,3,3,3,2,
2,2,2,2,2,2,2,1,
1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,
1,2,2,2,2,2,2,2,
3,3,3,3,3,3,4,4,
4,4,4,5,5,5,5,5,
6,6,6,6,7,7,7,7,
8,8,8,8,9,9,9,10,
10,10,11,11,11,12,12,12,
13,13,13,14,14,14,15,15,
15,16,16,16,17,17,18,18,
18,19,19,20,20,21,21,21,
22,22,23,23,24,24,25,25,
25,26,26,27,27,28,28,29,
29,30,30,31,31,32,32,33,
33,34,35,35,36,36,37,37,
38,38,39,40,40,41,41,42,
42,43,44,44,45,45,46,47,
47,48,48,49,50,50,51,51,
52,53,53,54,55,55,56,57,
57,58,59,59,60,61,61,62,
63,63,64,65,65,66,67,67,
68,69,69,70,71,72,72,73,
74,74,75,76,77,77,78,79,
79,80,81,82,82,83,84,85,
85,86,87,87,88,89,90,90,
91,92,93,93,94,95,96,96,
97,98,99,100,100,101,102,103,
103,104,105,106,106,107,108,109,
110,110,111,112,113,113,114,115,
116,117,117,118,119,120,120,121,
122,123,124,124,125,126,127,128
};
#endif /* SINELUT_H_ */
\ No newline at end of file
......@@ -32,14 +32,15 @@ void spi_init(spiport_t *spi, uint32_t gclknum, uint32_t gclkidcore, uint8_t bau
// to add to this lib: doc, cleaning, options properly enumerated: do when doing AS5147
// clk is unmasked (external to this lib)
// do pin configs
spi->port->DIRCLR.reg |= spi->miso_bm;
spi->port->DIRCLR.reg = spi->miso_bm;
spi->port->PINCFG[spi->miso_pin].bit.PMUXEN = 1;
spi->port->DIRSET.reg |= spi->mosi_bm | spi->sck_bm | spi->csn_bm;
spi->port->DIRSET.reg = spi->mosi_bm | spi->sck_bm | spi->csn_bm;
spi->port->PINCFG[spi->mosi_pin].bit.PMUXEN = 1;
spi->port->PINCFG[spi->sck_pin].bit.PMUXEN = 1;
if(csnhardware){
spi->port->PINCFG[spi->csn_pin].bit.PMUXEN = 1;
spi->com->SPI.CTRLB.reg |= SERCOM_SPI_CTRLB_MSSEN;
if(spi->csn_pin % 2){ // yes if odd
spi->port->PMUX[spi->csn_pin >> 1].reg |= PORT_PMUX_PMUXO(spi->peripheral);
} else {
......@@ -114,10 +115,22 @@ void spi_txchars_polled(spiport_t *spi, uint8_t *data, uint8_t length){
for(int i = 0; i < length; i ++){
spi_txchar_polled(spi, data[i]);
}
while(!spi->com->SPI.INTFLAG.bit.TXC); // wait for complete before
while(!spi->com->SPI.INTFLAG.bit.TXC); // wait for complete of last byte before
spi->port->OUTSET.reg = spi->csn_bm;
}
void spi_txrxchars_polled(spiport_t *spi, uint8_t *data_tx, uint8_t length, uint8_t *data_rx){
spi->port->OUTCLR.reg = spi->csn_bm;
for(int i = 0; i < length; i ++){
while(!(spi->com->SPI.INTFLAG.bit.DRE));
spi->com->SPI.DATA.reg = SERCOM_SPI_DATA_DATA(data_tx[i]);
while(!(spi->com->SPI.INTFLAG.bit.RXC)); // wait for data to come out of rx buffer
data_rx[i] = spi->com->SPI.DATA.reg;
}
while(!spi->com->SPI.INTFLAG.bit.TXC); // wait for complete of last byte before
spi->port->OUTSET.reg = spi->csn_bm;
}
void spi_txrxchar_polled(spiport_t *spi, uint8_t data, uint8_t *rxdata){
// how to read?
// not yet bc so far have not needed single receive
}
\ No newline at end of file
......@@ -37,6 +37,7 @@ void spi_init(spiport_t *spi, uint32_t gclknum, uint32_t gclkidcore, uint8_t bau
void spi_txchar_polled(spiport_t *spi, uint8_t data);
void spi_txchars_polled(spiport_t *spi, uint8_t *data, uint8_t length);
void spi_txrxchar_polled(spiport_t *spi, uint8_t data, uint8_t *rxdata);
void spi_txrxchar_polled(spiport_t *spi, uint8_t data, uint8_t *rxdata); // not implemented, use
void spi_txrxchars_polled(spiport_t *spi, uint8_t *data_tx, uint8_t length, uint8_t *data_rx);
#endif /* SPIPORT_H_ */
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment