tutrcos
読み取り中…
検索中…
一致する文字列を見つけられません
sts3215.hpp
[詳解]
1#pragma once
2
3#include <algorithm>
4#include <array>
5#include <cmath>
6#include <cstddef>
7#include <cstdint>
8
10#include "tutrcos/utility.hpp"
11
12#include "encoder_base.hpp"
13
14namespace tutrcos {
15namespace module {
16
64class STS3215 : public EncoderBase {
65public:
66 enum class Mode {
67 RAD = 0,
68 PWM = 2,
69 };
70
71 STS3215(peripheral::UART &uart, Mode mode, uint8_t id)
72 : EncoderBase{ppr_}, uart_{uart}, mode_{mode}, id_{id} {}
73
74 bool update() {
75 uint8_t rx_data[8] = {0};
76 uart_.flush();
77 if (send({0x02, 0x38, 0x02})) {
78 // rx_data : 0xff 0xff id size cmd data data checksum
79 if (uart_.receive(rx_data, 8, 1)) {
80 uint8_t checksum = 0;
81 for (uint8_t i = 2; i < 8; i++) {
82 checksum += rx_data[i];
83 }
84 if ((rx_data[0] == 0xff) && (rx_data[1] == 0xff) &&
85 (checksum == 0xff) && (rx_data[2] == id_)) {
86
87 int16_t count = static_cast<int16_t>(rx_data[6] << 8) | rx_data[5];
88 int16_t delta = count - prev_count_;
89
90 if (delta > (ppr_ / 2)) {
91 delta -= ppr_;
92 } else if (delta < -(ppr_ / 2)) {
93 delta += ppr_;
94 }
95
96 set_count(get_count() + delta);
97 prev_count_ = count;
98 }
99 }
100 }
101
102 bool res = true;
103 // transmit
104 int16_t target = 0;
105 uint8_t upper, lower;
106 switch (mode_) {
107 case Mode::RAD:
108 ref_ = std::clamp<float>(ref_, 0, 2 * M_PI);
109 target = ref_ / (2 * M_PI) * (ppr_ - 1);
110 upper = static_cast<uint8_t>(target >> 8);
111 lower = static_cast<uint8_t>(target);
112 res = send({0x03, 0x2A, lower, upper});
113 break;
114 case Mode::PWM:
115 ref_ = std::clamp<float>(ref_, -1, 1);
116 target = static_cast<uint16_t>(abs(ref_ * 1023));
117 upper = static_cast<uint8_t>(target >> 8) | ((ref_ > 0) ? 0x04 : 0);
118 lower = static_cast<uint8_t>(target);
119 res = send({0x03, 0x2C, lower, upper});
120 break;
121 }
122 return res;
123 }
124
125 void set_ref(float value) { ref_ = value; }
126
127private:
128 inline static constexpr uint16_t ppr_ = 4096;
129 peripheral::UART &uart_;
130 Mode mode_;
131 const uint8_t id_;
132 float ref_ = 0;
133 int16_t prev_count_ = 0;
134 int16_t rpm_ = 0;
135 int16_t current_ = 0;
136 int16_t current_target_ = 0;
137
138 bool send(std::vector<uint8_t> tx) {
139 uint8_t size = tx.size() + 1;
140 tx.insert(tx.begin(), {0xff, 0xff, id_, size});
141 uint8_t checksum = 0;
142 for (uint8_t i = 2, size = tx.size(); i < size; i++) {
143 checksum += tx[i];
144 }
145 tx.emplace_back(~checksum);
146 return uart_.transmit(tx.data(), size + 5, 1);
147 }
148};
149
150} // namespace module
151} // namespace tutrcos
Definition encoder_base.hpp:10
void set_count(int64_t count)
Definition encoder_base.hpp:28
int64_t get_count()
Definition encoder_base.hpp:16
Definition sts3215.hpp:64
STS3215(peripheral::UART &uart, Mode mode, uint8_t id)
Definition sts3215.hpp:71
Mode
Definition sts3215.hpp:66
void set_ref(float value)
Definition sts3215.hpp:125
bool update()
Definition sts3215.hpp:74
Definition uart.hpp:51
bool receive(uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:85
bool transmit(const uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:69
void flush()
Definition uart.hpp:101
Definition kernel.hpp:7