test
a4960.cpp@0:56b10b0c7db4, 2018-03-01 (annotated)
- Committer:
- tanabe2000
- Date:
- Thu Mar 01 00:46:05 2018 +0000
- Revision:
- 0:56b10b0c7db4
tekito; ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tanabe2000 | 0:56b10b0c7db4 | 1 | #include "a4960.h" |
tanabe2000 | 0:56b10b0c7db4 | 2 | |
tanabe2000 | 0:56b10b0c7db4 | 3 | a4960::a4960() : spi(PB_15,PB_14,PB_13), _cs_pin(PB_1), _blink_pin(LED1), _PWM_pin(PA_11) |
tanabe2000 | 0:56b10b0c7db4 | 4 | { |
tanabe2000 | 0:56b10b0c7db4 | 5 | PWM_freq = 20000.0; |
tanabe2000 | 0:56b10b0c7db4 | 6 | PWM_duty = 0.5; |
tanabe2000 | 0:56b10b0c7db4 | 7 | motor_started = true; |
tanabe2000 | 0:56b10b0c7db4 | 8 | |
tanabe2000 | 0:56b10b0c7db4 | 9 | _config[0] = 0b0000000000000000; // 50 us comm blank time, 2.4 us blank time, 200 ns deadtime |
tanabe2000 | 0:56b10b0c7db4 | 10 | _config[1] = 0b0010000000000000; // Vri = 100% Vref, Vdsth = 800mV |
tanabe2000 | 0:56b10b0c7db4 | 11 | _config[2] = 0b0100000000000000; // 35.6 us current control time |
tanabe2000 | 0:56b10b0c7db4 | 12 | _config[3] = 0b0110000000000000; // current limited, 50% current for hold, 18ms hold time |
tanabe2000 | 0:56b10b0c7db4 | 13 | _config[4] = 0b1000000000000000; // 0.8ms min comm time, 24 ms start comm time |
tanabe2000 | 0:56b10b0c7db4 | 14 | _config[5] = 0b1010000000000000; // 16.875deg phase adv, 100% ramp current, 0.4ms ramp rate |
tanabe2000 | 0:56b10b0c7db4 | 15 | _config[6] = 0b1100000000000000; // fault detection all on |
tanabe2000 | 0:56b10b0c7db4 | 16 | _config[7] = 0b1110000000000100; |
tanabe2000 | 0:56b10b0c7db4 | 17 | // auto BEMF hyst, 3.2us zx det window, no stop on fail, DIAG pin = fault, restart on loss of sync, brake off, forward, coast |
tanabe2000 | 0:56b10b0c7db4 | 18 | |
tanabe2000 | 0:56b10b0c7db4 | 19 | SPI_init(); |
tanabe2000 | 0:56b10b0c7db4 | 20 | } |
tanabe2000 | 0:56b10b0c7db4 | 21 | |
tanabe2000 | 0:56b10b0c7db4 | 22 | void a4960::SPI_init() |
tanabe2000 | 0:56b10b0c7db4 | 23 | { |
tanabe2000 | 0:56b10b0c7db4 | 24 | // initialize pins |
tanabe2000 | 0:56b10b0c7db4 | 25 | _cs_pin = 1; |
tanabe2000 | 0:56b10b0c7db4 | 26 | _blink_pin = 1; |
tanabe2000 | 0:56b10b0c7db4 | 27 | _PWM_pin.period(1/PWM_freq); |
tanabe2000 | 0:56b10b0c7db4 | 28 | _PWM_pin.write(PWM_duty); |
tanabe2000 | 0:56b10b0c7db4 | 29 | spi.format(16,3); |
tanabe2000 | 0:56b10b0c7db4 | 30 | spi.frequency(1000000); |
tanabe2000 | 0:56b10b0c7db4 | 31 | // initialize SPI connection |
tanabe2000 | 0:56b10b0c7db4 | 32 | //SPI.begin(P0_8, P0_9, P0_11);//SCK, MOSI, MOSI |
tanabe2000 | 0:56b10b0c7db4 | 33 | // set registers to default config |
tanabe2000 | 0:56b10b0c7db4 | 34 | for (int i = 0; i < 8; i++) { |
tanabe2000 | 0:56b10b0c7db4 | 35 | write_to_a4960(_config[i]); |
tanabe2000 | 0:56b10b0c7db4 | 36 | } |
tanabe2000 | 0:56b10b0c7db4 | 37 | // turn off pin to indicate initialization complete |
tanabe2000 | 0:56b10b0c7db4 | 38 | _blink_pin = 0; |
tanabe2000 | 0:56b10b0c7db4 | 39 | } |
tanabe2000 | 0:56b10b0c7db4 | 40 | void a4960::write_to_a4960(uint16_t msg) |
tanabe2000 | 0:56b10b0c7db4 | 41 | { |
tanabe2000 | 0:56b10b0c7db4 | 42 | // split 16-bit message to a4960 into two 8-bit messages |
tanabe2000 | 0:56b10b0c7db4 | 43 | uint8_t ms_half; |
tanabe2000 | 0:56b10b0c7db4 | 44 | uint8_t ls_half; |
tanabe2000 | 0:56b10b0c7db4 | 45 | |
tanabe2000 | 0:56b10b0c7db4 | 46 | // ---- 1st message (bits 15 - 8) |
tanabe2000 | 0:56b10b0c7db4 | 47 | // 3 bit address |
tanabe2000 | 0:56b10b0c7db4 | 48 | // 12 bit message |
tanabe2000 | 0:56b10b0c7db4 | 49 | // shift message to get rid of 8 LSB on the end and OR |
tanabe2000 | 0:56b10b0c7db4 | 50 | // the write bit and the |
tanabe2000 | 0:56b10b0c7db4 | 51 | // 4 remaining bits into the first-half msg |
tanabe2000 | 0:56b10b0c7db4 | 52 | ms_half = 1 << 4 | (uint8_t)(msg>>8); |
tanabe2000 | 0:56b10b0c7db4 | 53 | // ---- 2nd message (bits 7 - 0) |
tanabe2000 | 0:56b10b0c7db4 | 54 | ls_half = (uint8_t)(msg); |
tanabe2000 | 0:56b10b0c7db4 | 55 | |
tanabe2000 | 0:56b10b0c7db4 | 56 | // pull to active low |
tanabe2000 | 0:56b10b0c7db4 | 57 | _cs_pin = 0; |
tanabe2000 | 0:56b10b0c7db4 | 58 | wait_us(200); |
tanabe2000 | 0:56b10b0c7db4 | 59 | |
tanabe2000 | 0:56b10b0c7db4 | 60 | // transfer the to messages halves, MSB first |
tanabe2000 | 0:56b10b0c7db4 | 61 | printf("test %d :%d\n\r",spi.write(ms_half<<8 | ls_half),(ms_half<<8 | ls_half)); |
tanabe2000 | 0:56b10b0c7db4 | 62 | printf("test2 :%d",spi.write(0)); |
tanabe2000 | 0:56b10b0c7db4 | 63 | |
tanabe2000 | 0:56b10b0c7db4 | 64 | // wait and pull CS line back to inactive high |
tanabe2000 | 0:56b10b0c7db4 | 65 | wait_us(200); |
tanabe2000 | 0:56b10b0c7db4 | 66 | _cs_pin = 1; |
tanabe2000 | 0:56b10b0c7db4 | 67 | } |
tanabe2000 | 0:56b10b0c7db4 | 68 | |
tanabe2000 | 0:56b10b0c7db4 | 69 | void a4960::write_run(void) |
tanabe2000 | 0:56b10b0c7db4 | 70 | { |
tanabe2000 | 0:56b10b0c7db4 | 71 | write_to_a4960(_config[7] | 1); |
tanabe2000 | 0:56b10b0c7db4 | 72 | } |
tanabe2000 | 0:56b10b0c7db4 | 73 | |
tanabe2000 | 0:56b10b0c7db4 | 74 | void a4960::write_brake(void) |
tanabe2000 | 0:56b10b0c7db4 | 75 | { |
tanabe2000 | 0:56b10b0c7db4 | 76 | write_to_a4960(_config[7]); |
tanabe2000 | 0:56b10b0c7db4 | 77 | } |
tanabe2000 | 0:56b10b0c7db4 | 78 | |
tanabe2000 | 0:56b10b0c7db4 | 79 | int a4960::read() |
tanabe2000 | 0:56b10b0c7db4 | 80 | { _cs_pin = 0; |
tanabe2000 | 0:56b10b0c7db4 | 81 | uint8_t h; |
tanabe2000 | 0:56b10b0c7db4 | 82 | wait_us(200); |
tanabe2000 | 0:56b10b0c7db4 | 83 | h = spi.write(0b1110000000000000); |
tanabe2000 | 0:56b10b0c7db4 | 84 | //h = spi.write(0); |
tanabe2000 | 0:56b10b0c7db4 | 85 | wait_us(200); |
tanabe2000 | 0:56b10b0c7db4 | 86 | _cs_pin = 1; |
tanabe2000 | 0:56b10b0c7db4 | 87 | return h; |
tanabe2000 | 0:56b10b0c7db4 | 88 | } |