エンコーダから速度を測定する。 ボーレートは115200bps、データのみを送信する。
Dependencies: mbed nucleo_rotary_encoder
main.cpp
- Committer:
- Akito914
- Date:
- 2017-09-06
- Revision:
- 0:3858dd3441ba
File content as of revision 0:3858dd3441ba:
#include "mbed.h" #include "rotary_encoder_ab_phase.hpp" #define sample_num_max 10000 #define sampling_period 500 #define reel_radius 25.0 // unit : mm #define countPerRevol 4000 rotary_encoder_ab_phase encoder(TIM1,1000); DigitalOut myled(LED1); DigitalIn button(USER_BUTTON); Serial pc(USBTX, USBRX); Timer timer; uint32_t sampling_count = 0; int16_t sample_data[sample_num_max] = {0}; int32_t sample_time_us[sample_num_max] = {0}; int32_t get_encoder(void){ static int32_t counts = 0; static int32_t p_raw_counts = 0; int32_t raw_counts; raw_counts=encoder.get_counts(); if((raw_counts - p_raw_counts) > 30000){ counts -= 65535 - (raw_counts - p_raw_counts); } else if((raw_counts - p_raw_counts) < -30000){ counts += 65535 - (p_raw_counts - raw_counts); } else{ counts += raw_counts - p_raw_counts; } p_raw_counts = raw_counts; return counts; } int32_t get_encoder_diff(void){ int32_t diff = 0; static int32_t p_raw_counts = 0; int32_t raw_counts; raw_counts=encoder.get_counts(); if((raw_counts - p_raw_counts) > 30000){ diff = 65535 - (raw_counts - p_raw_counts); } else if((raw_counts - p_raw_counts) < -30000){ diff = 65535 - (p_raw_counts - raw_counts); } else{ diff = raw_counts - p_raw_counts; } p_raw_counts = raw_counts; return diff; } double dabs(double val){ if(val < 0.0)return val * -1; return val; } int main() { int32_t ex_time_us = 0; int32_t interval_us = 0; double revolPerSec; double speed = 0.0; pc.baud(115200); encoder.start(); //pc.printf("Hello\n"); wait_ms(100); //pc.printf("wait starting ...\n"); while(button == 1); //pc.printf("sampling ...\n"); get_encoder_diff(); timer.start(); timer.reset(); while(button == 0) { wait_us(sampling_period); sample_time_us[sampling_count] = timer.read_us(); sample_data[sampling_count] = get_encoder_diff(); sampling_count += 1; if(sampling_count >= sample_num_max - 1){ break; } } //pc.printf("sampling finished\n"); for(uint32_t count = 0; count < sampling_count; count++){ interval_us = sample_time_us[count] - ex_time_us; ex_time_us = sample_time_us[count]; revolPerSec = (double)sample_data[count] * 1000000.0 / countPerRevol / (double)interval_us; speed = 2 * 3.14159265 * reel_radius / 1000.0 * revolPerSec; pc.printf("%d, %f\n", sample_time_us[count], speed); } while(1); }