diff --git a/circuit/mkbldcdriver/eagle.epf b/circuit/mkbldcdriver/eagle.epf index bc65f2670df52f1c1b84b5fcfc203417b18fec61..b7dc703852c482ce7f222a541fd910b85f304f70 100644 --- a/circuit/mkbldcdriver/eagle.epf +++ b/circuit/mkbldcdriver/eagle.epf @@ -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" diff --git a/datasheet/AS5047D_DS000394_2-00.pdf b/datasheet/AS5047D_DS000394_2-00.pdf deleted file mode 100644 index bd7745369078f278fc12f0b02ebaac3cf1811a11..0000000000000000000000000000000000000000 Binary files a/datasheet/AS5047D_DS000394_2-00.pdf and /dev/null differ diff --git a/datasheet/AS5147_DS000307_2-00.pdf b/datasheet/AS5147_DS000307_2-00.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c4e3b93373f58070fdf0e7d3b56bd0644b069bc Binary files /dev/null and b/datasheet/AS5147_DS000307_2-00.pdf differ diff --git a/datasheet/ATSAMD51.pdf b/datasheet/ATSAMD51.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6da17e882705592c3103cd5e1703b9f7cacffcaf Binary files /dev/null and b/datasheet/ATSAMD51.pdf differ diff --git a/embedded/README.md b/embedded/README.md index 275f667ecfd99dd3ef48e41a9d50532133d65c98..506601ec60c362b12b01cc992c6b30b6e08a27ac 100644 --- a/embedded/README.md +++ b/embedded/README.md @@ -501,4 +501,19 @@ int main(void)  -Now we do v0.31 board, new step board, etc. Go team, big day. \ No newline at end of file +Now we do v0.31 board, new step board, etc. Go team, big day. + +# Waking up v0.31 + + + +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. + diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/hardware.h b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/hardware.h index 8b6c756c99997d2bedf695ba92d6e48fca02d8ba..1566dda3d369e8e5cb02c7eca5fa801c27ebef5a 100644 --- a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/hardware.h +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/hardware.h @@ -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 diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/main.c b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/main.c index 5dabe538721b1e50284ae6641948cdb92d5ce251..4cbb5f5cac5daf6de3696bf3b2acdc5986690d38 100644 --- a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/main.c +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/main.c @@ -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); @@ -48,26 +64,119 @@ int main(void) up2 = uart_new(SERCOM5, &PORT->Group[1], &up2_rbrx, &up2_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); 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(); + + // 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); - // integrate SPI, test AS5147, library + // 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){ diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/mkbldcdriver-v03.cproj b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/mkbldcdriver-v03.cproj index 223a021630cb61a500f6afa641704ec25b141ca1..afe85b64ef67f91c5fd6183067a3f0b530010b38 100644 --- a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/mkbldcdriver-v03.cproj +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/mkbldcdriver-v03.cproj @@ -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> diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/sinelut.h b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/sinelut.h new file mode 100644 index 0000000000000000000000000000000000000000..198f4b46dc015cfeb6c52245aea8c4516279835d --- /dev/null +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/sinelut.h @@ -0,0 +1,148 @@ +/* + * 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 diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.c b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.c index 974bbb00297276d1de1b0a1e843befdc5bb220bf..0e3e6b941dd4b584550d23d3cfffb6c9ba496d4a 100644 --- a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.c +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.c @@ -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 diff --git a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.h b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.h index 5b6000d4f1d81e0543a2fe544a76c4f574e6a3d1..d08126a104c54c7069caa3fc82ea48eaa3480ebf 100644 --- a/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.h +++ b/embedded/mkbldcdriver-v03/mkbldcdriver-v03/spiport.h @@ -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 diff --git a/images/programming-spi-atsam51-as5147.png b/images/programming-spi-atsam51-as5147.png new file mode 100644 index 0000000000000000000000000000000000000000..5787765de2df119bf5fd8f2945b561e7c977688e Binary files /dev/null and b/images/programming-spi-atsam51-as5147.png differ