Emakefun DM11 Arduino 库 1.0.4
载入中...
搜索中...
未找到
dm11.cpp
浏览该文件的文档.
1/**
2 * @file dm11.cpp
3 */
4#include "dm11.h"
5
6#include <Arduino.h>
7
8namespace em {
9namespace {
10enum MemoryAddress : uint8_t {
11 kMemAddrPwmDuty0 = 0x50,
12 kMemAddrPwmDuty1 = 0x52,
13 kMemAddrPwmDuty2 = 0x54,
14 kMemAddrPwmDuty3 = 0x56,
15 kMemAddrFrequency = 0x60,
16};
17}
18
19Dm11::Dm11(const uint8_t i2c_address, TwoWire& wire) : i2c_address_(i2c_address), wire_(wire) {
20}
21
22Dm11::ErrorCode Dm11::Init(const uint16_t frequency_hz) {
23 if (frequency_hz < kMinFrequencyHz || frequency_hz > kMaxFrequencyHz) {
24 return kInvalidParameter;
25 }
26
27 wire_.beginTransmission(i2c_address_);
28 wire_.write(kMemAddrFrequency);
29 wire_.write(reinterpret_cast<const uint8_t*>(&frequency_hz), sizeof(frequency_hz));
30 const auto ret = static_cast<ErrorCode>(wire_.endTransmission());
31 if (ret != kOK) {
32 return ret;
33 }
34
35 const uint16_t duties[kPwmChannelNum] = {0};
36 wire_.beginTransmission(i2c_address_);
37 wire_.write(kMemAddrPwmDuty0);
38 wire_.write(reinterpret_cast<const uint8_t*>(duties), sizeof(duties));
39 return static_cast<ErrorCode>(wire_.endTransmission());
40}
41
42Dm11::ErrorCode Dm11::PwmDuty(const PwmChannel pwm_channel, uint16_t duty) {
43 if (pwm_channel >= kPwmChannelNum) {
44 return kInvalidParameter;
45 }
46 duty = min(kMaxPwmDuty, duty);
47 wire_.beginTransmission(i2c_address_);
48 wire_.write(kMemAddrPwmDuty0 + (((pwm_channel + 2) % kPwmChannelNum) << 1));
49 wire_.write(reinterpret_cast<const uint8_t*>(&duty), sizeof(duty));
50 return static_cast<ErrorCode>(wire_.endTransmission());
51}
52}
static constexpr uint16_t kMaxFrequencyHz
最大PWM波频率。
定义 dm11.h:56
PwmChannel
PWM通道。
定义 dm11.h:170
@ kPwmChannelNum
PWM通道数。
定义 dm11.h:215
static constexpr uint16_t kMaxPwmDuty
最大PWM占空比。
定义 dm11.h:66
Dm11(const uint8_t i2c_address=kDefaultI2cAddress, TwoWire &wire=Wire)
构造函数,指定 I2C 地址和 TwoWire 对象。
ErrorCode
错误码。
定义 dm11.h:78
@ kOK
成功。
定义 dm11.h:87
@ kInvalidParameter
参数错误。
定义 dm11.h:147
ErrorCode PwmDuty(const PwmChannel pwm_channel, uint16_t duty)
设置指定通道的 PWM 占空比。
ErrorCode Init(const uint16_t frequency_hz=1000)
初始化函数。