差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
digi:arm-embedded:ccmp2:encoder_dts [2025/03/31 22:32] robindigi:arm-embedded:ccmp2:encoder_dts [2025/03/31 23:44] (当前版本) robin
行 177: 行 177:
 {{:digi:arm-embedded:ccmp2:pasted:20250331-201625.png}} {{:digi:arm-embedded:ccmp2:pasted:20250331-201625.png}}
  
-补充:用cubeMX生成的设备树发现,和smartIOMUX一样,是用AF8,因此,只能用input capture direct mode来操作+补充:用cubeMX生成的设备树发现,和smartIOMUX一样,是用AF8,因此,如果用ch3,ch4只能用input capture direct mode来操作,  
 + 
 +根据AI给的说法:虽然也可以把将CH3和CH4配置为输入捕获模式,在中断或轮询中读取捕获值,计算脉冲数和方向,或是通过软件逻辑模拟正交编码器的计数和方向判断,但这样实时性较差,占用CPU资源,适合低速场景。 
 +因此能用上专用的encoder的模式肯定效率高一些 
 + 
 +一个完整的电机控制的设备树的例子参考如下,可根据板子情况参考: 
 +<code> 
 +/ { 
 +    // 配置时钟(确保定时器时钟源正确) 
 +    clocks { 
 +        // 假设TIM1使用APB2时钟(需根据实际时钟树配置) 
 +        tim1_clk: tim1-clk { 
 +            #clock-cells = <0>; 
 +            compatible = "fixed-clock"; 
 +            clock-frequency = <16000000>; // 16 MHz(示例) 
 +        }; 
 +    }; 
 + 
 +    // PWM控制器配置(TIM1通道1用于PWM输出) 
 +    pwm_motor: pwm-motor { 
 +        compatible = "st,stm32-pwm"; 
 +        #pwm-cells = <3>; 
 +        reg = <0x40010000 0x400>; // TIM1寄存器基地址 
 +        clocks = <&tim1_clk>; 
 +        status = "okay"; 
 + 
 +        pwm@0 { 
 +            // 通道1(TIM1_CH1)作为PWM输出 
 +            reg = <0>; 
 +            st,pwm-channels = <1>; // 使用通道1 
 +            st,pwm-period-ns = <50000>; // PWM周期50us(20kHz) 
 +        }; 
 +    }; 
 + 
 +    // 编码器接口(TIM3通道1和2用于正交编码器) 
 +    encoder_motor: encoder-motor { 
 +        compatible = "st,stm32-timer-encoder"; 
 +        reg = <0x40000400 0x400>; // TIM3寄存器基地址 
 +        st,encoder-mode = <1>; // 编码器模式:TI1和TI2均捕获边沿 
 +        st,capture-channels = <1 2>; // 使用通道1和2(TIM3_CH1和TIM3_CH2) 
 +        clocks = <&rcc TIM3_K>; 
 +        status = "okay"; 
 +    }; 
 + 
 +    // 霍尔传感器GPIO中断(可选,用于无刷电机换相) 
 +    hall_sensor { 
 +        compatible = "gpio-keys"; 
 +        hall-u { 
 +            label = "HALL_U"; 
 +            gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>; // PA0为霍尔U相信号 
 +            linux,code = <0x100>; // 自定义输入事件 
 +        }; 
 +        hall-v { /* 类似配置 */ }; 
 +        hall-w { /* 类似配置 */ }; 
 +    }; 
 + 
 +    // ADC配置(用于电流采样,可选) 
 +    adc_motor: adc-motor { 
 +        compatible = "st,stm32-adc"; 
 +        reg = <0x48003000 0x400>; // ADC1基地址 
 +        vref-supply = <&vrefbuf>; 
 +        st,adc-channels = <5 6>; // 使用ADC1_IN5和IN6(电流检测) 
 +        status = "okay"; 
 +    }; 
 +}; 
 +</code>