PWM方式读取AS5600磁编码器获取角度例程
- 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》
- 📌《HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程》
- 🎉本例程包含:Arduino测试代码、STM32标准库代码、HAL STM32代码。
📙PWM 输出模式
📝AS5600可以在CONF寄存器的OUTS位上设置PWM编码的数字输出(OUTS = 10)。在该模式下OUT引脚输出一个数字PWM 信号。每个脉冲的占空比与磁铁旋转的绝对角度成正比。PWM信号由4351个PWM时钟周期组成.该PWM 框架由以下部分组成:
• 128 PWM 高时钟周期
• 4095 PWM 数据时钟周期
• 128 PWM 低时钟周期
- 📄AS5600 脉冲宽度调制模式的输出特性:
📑PWM脉宽测量
📝AS5600 输出的PWM信号,主要是对其脉宽测量。通过定时器查询检测引脚的高电平时间即可。如果使用定时器捕获功能也可以,只不过需要特定通道引脚才行。
-
🎈相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》
-
🍁先通过IIC读取的角度值和逻辑分析仪抓取的AS5600 OUT引脚的输出PWM占空比波形对比图:
- 🌿由于AS5600 OUT引脚输出的PWM频率,最高920Hz,对于STM32单片机,定时器捕获脉宽,频率并不需要太高,占空比范围10% - 90%。
- 🔖上面对应的角度值:
359
⛳AS5600 PWM方式输出配置
- 👉AS5600 芯片默认情况下,OUT引脚是不输出数字PWM波形的,需要通过i2C通讯方式,配置
CONF
寄存器,对应位,才能让OUT
引脚,输出PWM波形。明白这一点很重要。网上很少有人提及,可能使用该方式的不多。一旦配置好后,断电重启是可以保持该寄存器原写入的数据。(也就是一次配置,终生有效)
📘代码实现PWM脉宽测量
📗Arduino脉宽测量代码
- 🌿利用
pulseIn()
函数获取脉宽时间。
void setup() {Serial.begin(115200);Serial.println("Start initing.....");
}void loop() {long int a = millis();int value = pulseIn(6, HIGH);//读取高电平持续时间Serial.print(millis() - a);Serial.print(" ");Serial.println(value);delay(200);Serial.flush();
}
📘标准库代码源码
链接:https://pan.baidu.com/s/110g03mNORMLpaWO6IJNaAg?pwd=ue13
提取码:ue13
📒HAL库代码源码
- 📝核心代码实现:
uint16_t get_AS5600_pwm_value(void)
{flag_as5600_outtime = 0;__HAL_TIM_SET_COUNTER(&htim3, 0) ;HAL_TIM_Base_Start_IT(&htim3); //启动定时器while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) &&(flag_as5600_outtime == 0)); //高电平过去一个while(!HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)&&(flag_as5600_outtime == 0)); //低电平过去一个,开始读取数据__HAL_TIM_SET_COUNTER(&htim3, 0) ; //清空计数值
// HAL_TIM_Base_Start_IT(&htim3); //启动定时器while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)&&(flag_as5600_outtime == 0)) {} //读取结束HAL_TIM_Base_Stop_IT(&htim3); //启动定时器if(flag_as5600_outtime == 1) {flag_as5600_outtime = 0;return 65535;}return (__HAL_TIM_GET_COUNTER(&htim3));
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3) {if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) {flag_as5600_outtime = 1; //超时__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);}// __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);//清楚更新中断标志位// HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}}
链接:https://pan.baidu.com/s/1SiZ3Ndw6_YDZ1T3UICn07g?pwd=i2nh
提取码:i2nh