A program to monitor some parameters for a motor

Dependencies:   mbed-dev BufferSerial

Thanks to David Lowe for https://developer.mbed.org/users/gregeric/code/Nucleo_Hello_Encoder/ which I adapted for the use of TIM2 32bit timer as an encoder reader on the Nucleo L432KC board.

Committer:
tonnyleonard
Date:
Thu May 18 00:08:20 2017 +0000
Revision:
7:7f59b69d8895
Parent:
6:5d4c09973041
Child:
8:28ad0ba5a673
Serial read implemented with interrupt (serial.attach() method)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tonnyleonard 0:789510d98ade 1 /*
tonnyleonard 0:789510d98ade 2 * Using STM32's counter peripherals to interface rotary encoders.
tonnyleonard 0:789510d98ade 3 * Encoders are supported on F4xx's TIM1,2,3,4,5. TIM2 & TIM5 have 32bit count, others 16bit.
tonnyleonard 0:789510d98ade 4 * Beware mbed uses TIM5 for system timer, SPI needs TIM1, others used for PWM.
tonnyleonard 0:789510d98ade 5 * Check your platform's PeripheralPins.c & PeripheralNames.h if you need both PWM & encoders.
tonnyleonard 0:789510d98ade 6 *
tonnyleonard 0:789510d98ade 7 * Edit HAL_TIM_Encoder_MspInitFx.cpp to suit your mcu & board's available pinouts & pullups/downs.
tonnyleonard 0:789510d98ade 8 *
tonnyleonard 0:789510d98ade 9 * Thanks to:
tonnyleonard 0:789510d98ade 10 * http://petoknm.wordpress.com/2015/01/05/rotary-encoder-and-stm32/
tonnyleonard 0:789510d98ade 11 *
tonnyleonard 0:789510d98ade 12 * References:
tonnyleonard 0:789510d98ade 13 * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00122015.pdf
tonnyleonard 0:789510d98ade 14 * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00096844.pdf
tonnyleonard 0:789510d98ade 15 * http://www.st.com/web/en/resource/technical/document/application_note/DM00042534.pdf
tonnyleonard 0:789510d98ade 16 * http://www.st.com/web/en/resource/technical/document/datasheet/DM00102166.pdf
tonnyleonard 7:7f59b69d8895 17 *
tonnyleonard 0:789510d98ade 18 * David Lowe Jan 2015
tonnyleonard 0:789510d98ade 19 */
tonnyleonard 0:789510d98ade 20
tonnyleonard 0:789510d98ade 21 #include "mbed.h"
tonnyleonard 0:789510d98ade 22 #include "Encoder.h"
tonnyleonard 6:5d4c09973041 23 #include "inttypes.h"
tonnyleonard 7:7f59b69d8895 24 #include <string.h> // strstr()
tonnyleonard 7:7f59b69d8895 25 #include <stdbool.h> // bool, true, false
tonnyleonard 0:789510d98ade 26
tonnyleonard 4:4f115819171f 27 TIM_Encoder_InitTypeDef encoder1;
tonnyleonard 5:29372f6cb533 28 TIM_HandleTypeDef timer2;
tonnyleonard 5:29372f6cb533 29 InterruptIn event(PA_8);
tonnyleonard 5:29372f6cb533 30 DigitalOut led(LED1);
tonnyleonard 6:5d4c09973041 31 AnalogIn adc1(PA_3); //ADC1_IN8
tonnyleonard 6:5d4c09973041 32 AnalogIn adc2(PA_5); //ADC1_IN10
tonnyleonard 6:5d4c09973041 33 AnalogIn adc3(PA_6); //ADC1_IN11
tonnyleonard 6:5d4c09973041 34 AnalogOut dac1(PA_4); // DAC1_OUT1
tonnyleonard 7:7f59b69d8895 35 //Serial pc(SERIAL_TX, SERIAL_RX);
tonnyleonard 7:7f59b69d8895 36 Serial pc(USBTX, USBRX);
tonnyleonard 7:7f59b69d8895 37 //Serial& pc = get_stdio_serial();
tonnyleonard 7:7f59b69d8895 38
tonnyleonard 7:7f59b69d8895 39 //Serial debug(PB_6,PA_10); // Serial1 tx rx
tonnyleonard 7:7f59b69d8895 40 //Serial configBT(PA_2,PA_3); // Serial2 tx rx
tonnyleonard 7:7f59b69d8895 41 //Serial slave(PC_10,PC_11); // Serial3 tx rx
tonnyleonard 7:7f59b69d8895 42 //Serial modem(PA_0,PA_1); // Serial4 tx rx
tonnyleonard 7:7f59b69d8895 43
tonnyleonard 5:29372f6cb533 44 uint32_t count1=0;
tonnyleonard 5:29372f6cb533 45 int16_t count2=0;
tonnyleonard 5:29372f6cb533 46 int16_t count3=0;
tonnyleonard 5:29372f6cb533 47 int16_t adjust=0;
tonnyleonard 7:7f59b69d8895 48 volatile bool adc3_en = false;
tonnyleonard 5:29372f6cb533 49 Timer timer1;
tonnyleonard 5:29372f6cb533 50
tonnyleonard 7:7f59b69d8895 51 void atint()
tonnyleonard 7:7f59b69d8895 52 {
tonnyleonard 5:29372f6cb533 53 timer1.start();
tonnyleonard 7:7f59b69d8895 54 if (__HAL_TIM_IS_TIM_COUNTING_DOWN(&timer2)) {
tonnyleonard 7:7f59b69d8895 55 adjust--;
tonnyleonard 7:7f59b69d8895 56 if (adjust == -3) {
tonnyleonard 5:29372f6cb533 57 count2--;
tonnyleonard 5:29372f6cb533 58 count1 +=__HAL_TIM_GET_COUNTER(&timer2);
tonnyleonard 5:29372f6cb533 59 TIM2->CNT = 0x0000;
tonnyleonard 5:29372f6cb533 60 adjust = 0;
tonnyleonard 5:29372f6cb533 61 led =!led;
tonnyleonard 5:29372f6cb533 62 }
tonnyleonard 7:7f59b69d8895 63 } else {
tonnyleonard 5:29372f6cb533 64 adjust++;
tonnyleonard 7:7f59b69d8895 65 if (adjust == 3) {
tonnyleonard 5:29372f6cb533 66 count2++;
tonnyleonard 5:29372f6cb533 67 count1 +=__HAL_TIM_GET_COUNTER(&timer2);
tonnyleonard 5:29372f6cb533 68 TIM2->CNT = 0x0000;
tonnyleonard 5:29372f6cb533 69 adjust = 0;
tonnyleonard 5:29372f6cb533 70 led =!led;
tonnyleonard 5:29372f6cb533 71 }
tonnyleonard 5:29372f6cb533 72 }
tonnyleonard 5:29372f6cb533 73 }
tonnyleonard 0:789510d98ade 74
tonnyleonard 7:7f59b69d8895 75 void readData(void)
tonnyleonard 7:7f59b69d8895 76 {
tonnyleonard 7:7f59b69d8895 77 char message[125];
tonnyleonard 7:7f59b69d8895 78 if(pc.readable()) {
tonnyleonard 7:7f59b69d8895 79 pc.scanf("%s", message);
tonnyleonard 7:7f59b69d8895 80 printf("%d %s\r\n", strlen(message), message);
tonnyleonard 7:7f59b69d8895 81 if (strcmp(message, "startAdc") == 0) {
tonnyleonard 7:7f59b69d8895 82 adc3_en = true;
tonnyleonard 7:7f59b69d8895 83 printf("true\r\n");
tonnyleonard 7:7f59b69d8895 84 } else {
tonnyleonard 7:7f59b69d8895 85 adc3_en = false;
tonnyleonard 7:7f59b69d8895 86 printf("false\r\n");
tonnyleonard 7:7f59b69d8895 87 }
tonnyleonard 7:7f59b69d8895 88
tonnyleonard 7:7f59b69d8895 89 }
tonnyleonard 7:7f59b69d8895 90 }
tonnyleonard 0:789510d98ade 91 int main()
tonnyleonard 0:789510d98ade 92 {
tonnyleonard 0:789510d98ade 93
tonnyleonard 7:7f59b69d8895 94 //counting on both A&B inputs (A at PA0, B at PA1), 4 ticks per cycle,
tonnyleonard 5:29372f6cb533 95 //full 32-bit count
tonnyleonard 7:7f59b69d8895 96 //For L432KC to work with TIM2 one needs to reassign the system ticker
tonnyleonard 2:958e9094b198 97 //from TIM2 to TIM7 in TARGET/../device/hal_tick.h
tonnyleonard 4:4f115819171f 98 EncoderInit(&encoder1, &timer2, TIM2, 0xffffffff, TIM_ENCODERMODE_TI12);
tonnyleonard 5:29372f6cb533 99 event.rise(&atint);
tonnyleonard 7:7f59b69d8895 100 pc.attach(&readData);
tonnyleonard 7:7f59b69d8895 101
tonnyleonard 4:4f115819171f 102 printf("\n\rSTM HAL encoder with ADC and DAC\n\r");
tonnyleonard 7:7f59b69d8895 103
tonnyleonard 6:5d4c09973041 104 //printf("%" PRIu32 "\n", UINT32_MAX);
tonnyleonard 7:7f59b69d8895 105
tonnyleonard 0:789510d98ade 106 while(1) {
tonnyleonard 5:29372f6cb533 107 uint32_t count3=0;
tonnyleonard 7:7f59b69d8895 108
tonnyleonard 4:4f115819171f 109 int8_t dir1;
tonnyleonard 6:5d4c09973041 110 uint16_t voltage1=0;
tonnyleonard 0:789510d98ade 111
tonnyleonard 0:789510d98ade 112
tonnyleonard 0:789510d98ade 113 //OK 401 411 446 NOK 030
tonnyleonard 5:29372f6cb533 114 //count1=TIM2->CNT;
tonnyleonard 5:29372f6cb533 115 //dir1=TIM2->CR1&TIM_CR1_DIR;
tonnyleonard 5:29372f6cb533 116 count3=__HAL_TIM_GET_COUNTER(&timer2);
tonnyleonard 4:4f115819171f 117 dir1 = __HAL_TIM_IS_TIM_COUNTING_DOWN(&timer2);
tonnyleonard 6:5d4c09973041 118 voltage1=adc1.read_u16();
tonnyleonard 6:5d4c09973041 119 dac1.write_u16(count3*2);
tonnyleonard 7:7f59b69d8895 120
tonnyleonard 5:29372f6cb533 121 printf("%ld%s passes=%d short=%ld\r\n", count1+count3, dir1==0 ? "+":"-", count2, count3);
tonnyleonard 6:5d4c09973041 122 printf("Voltage= %d, DAC=%f\r\n", voltage1, dac1.read()*3.3);
tonnyleonard 6:5d4c09973041 123 printf("percentage: %3.3f%%\r\n", adc2.read()*100.0f);
tonnyleonard 7:7f59b69d8895 124 if (adc3_en) {
tonnyleonard 7:7f59b69d8895 125 printf("percentage: %3.3f%V\r\n", adc3.read()*3.3f);
tonnyleonard 7:7f59b69d8895 126 }
tonnyleonard 7:7f59b69d8895 127
tonnyleonard 6:5d4c09973041 128
tonnyleonard 6:5d4c09973041 129 wait(2.1);
tonnyleonard 0:789510d98ade 130 }
tonnyleonard 0:789510d98ade 131 }