1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #ifndef __OSCILLATOR_H__
- #define __OSCILLATOR_H__
- #include "driver/ledc.h"
- #include "esp_log.h"
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #define M_PI 3.14159265358979323846
- #ifndef DEG2RAD
- #define DEG2RAD(g) ((g) * M_PI) / 180
- #endif
- #define SERVO_MIN_PULSEWIDTH_US 500 // 最小脉宽(微秒)
- #define SERVO_MAX_PULSEWIDTH_US 2500 // 最大脉宽(微秒)
- #define SERVO_MIN_DEGREE -90 // 最小角度
- #define SERVO_MAX_DEGREE 90 // 最大角度
- #define SERVO_TIMEBASE_RESOLUTION_HZ 1000000 // 1MHz, 1us per tick
- #define SERVO_TIMEBASE_PERIOD 20000 // 20000 ticks, 20ms
- class Oscillator {
- public:
- Oscillator(int trim = 0);
- ~Oscillator();
- void Attach(int pin, bool rev = false);
- void Detach();
- void SetA(unsigned int amplitude) { amplitude_ = amplitude; };
- void SetO(int offset) { offset_ = offset; };
- void SetPh(double Ph) { phase0_ = Ph; };
- void SetT(unsigned int period);
- void SetTrim(int trim) { trim_ = trim; };
- void SetLimiter(int diff_limit) { diff_limit_ = diff_limit; };
- void DisableLimiter() { diff_limit_ = 0; };
- int GetTrim() { return trim_; };
- void SetPosition(int position);
- void Stop() { stop_ = true; };
- void Play() { stop_ = false; };
- void Reset() { phase_ = 0; };
- void Refresh();
- int GetPosition() { return pos_; }
- private:
- bool NextSample();
- void Write(int position);
- uint32_t AngleToCompare(int angle);
- private:
- bool is_attached_;
- //-- Oscillators parameters
- unsigned int amplitude_; //-- Amplitude (degrees)
- int offset_; //-- Offset (degrees)
- unsigned int period_; //-- Period (miliseconds)
- double phase0_; //-- Phase (radians)
- //-- Internal variables
- int pos_; //-- Current servo pos
- int pin_; //-- Pin where the servo is connected
- int trim_; //-- Calibration offset
- double phase_; //-- Current phase
- double inc_; //-- Increment of phase
- double number_samples_; //-- Number of samples
- unsigned int sampling_period_; //-- sampling period (ms)
- long previous_millis_;
- long current_millis_;
- //-- Oscillation mode. If true, the servo is stopped
- bool stop_;
- //-- Reverse mode
- bool rev_;
- int diff_limit_;
- long previous_servo_command_millis_;
- ledc_channel_t ledc_channel_;
- ledc_mode_t ledc_speed_mode_;
- };
- #endif // __OSCILLATOR_H__
|