/* * @Author: mypx * @Date: 2025-07-18 08:53:22 * @LastEditTime: 2025-09-24 14:24:19 * @LastEditors: mypx mypx_coder@163.com * @Description: */ #include "pm_common.h" #include "et_encoder_utils.h" #include "et_log.h" struct rt_event pm_event; uint32_t encoder_cpr; /** * @brief Correct specific rotation for temperature using linear coefficient * * @param specific_rotation_ref Specific rotation at reference temperature (°) * @param tref Reference temperature (°C) * @param temp Target temperature (°C) * @param temp_coeff Temperature coefficient (° per °C) * @return Corrected specific rotation at target temperature (°) */ float pm_correct_specific_rotation_temperature(float specific_rotation_ref, float tref, float temp, float temp_coeff) { /* Simple linear correction: [α](T) = [α](Tref) + coeff * (T - Tref) */ return specific_rotation_ref + temp_coeff * (temp - tref); } /** * @brief Convert concentration from g/100mL to g/mL */ float pm_convert_g_per_100ml_to_g_per_ml(float conc_g_per_100ml) { return conc_g_per_100ml / 100.0f; /* g/100mL -> g/mL */ } /** * @brief Convert concentration from g/100mL to mol/L */ float pm_convert_g_per_100ml_to_molar(float conc_g_per_100ml, float molar_mass_g_per_mol) { /* g/100mL -> g/L: multiply by 10 */ float g_per_l = conc_g_per_100ml * 10.0f; if (molar_mass_g_per_mol == 0.0f) { ET_ERR("molar mass cannot be zero\n"); return NAN; } return g_per_l / molar_mass_g_per_mol; /* mol/L */ } float pm_deg_to_rad(float deg) { return deg * (3.14159265358979323846f / 180.0f); } float pm_rad_to_deg(float rad) { return rad * (180.0f / 3.14159265358979323846f); } static double calculate_real_time_angle_degree(int64_t encoder_cnt_total) { return (double)(encoder_cnt_total) * 360.0f / encoder_cpr; } double get_real_time_angle_degree(void) { int64_t total_encoder_cnt = 0; int32_t curent_encoder_cnt = 0; curent_encoder_cnt = pm_encoder_get_count(); //curent_encoder_cnt = 65535 - curent_encoder_cnt; // 反向计数,或者更改AB线序 total_encoder_cnt = et_encoder_get_whole_count(curent_encoder_cnt, &encoder_tim_overflow_count, ENCODER_MAX_COUNT); //ET_DBG("encoder_cnt: %lld\n", (long long)total_encoder_cnt); return calculate_real_time_angle_degree(total_encoder_cnt); } rt_uint32_t convert_encoder_angle_rpm_to_to_time(double angle, float m_rpm) { rt_uint32_t delay = 0; double m_r = angle * MOTOR_TO_ENCODER_RATIO / 360.0; delay = (fabs(m_r) * 60.0 * 1000 / fabs(m_rpm)); // ms return delay; }