PWM方式读取AS5600磁编码器数据

PWM方式读取AS5600磁编码器获取角度例程


📙PWM 输出模式

📝AS5600可以在CONF寄存器的OUTS位上设置PWM编码的数字输出(OUTS = 10)。在该模式下OUT引脚输出一个数字PWM 信号。每个脉冲的占空比与磁铁旋转的绝对角度成正比。PWM信号由4351个PWM时钟周期组成.该PWM 框架由以下部分组成:
• 128 PWM 高时钟周期
• 4095 PWM 数据时钟周期
• 128 PWM 低时钟周期

  • 📄AS5600 脉冲宽度调制模式的输出特性:
    在这里插入图片描述

📑PWM脉宽测量

📝AS5600 输出的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
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPI是一种串行通信协议,用于在数字电路间传输数据。AS5047P是一种性角度编码器,用于测量旋转角度。在基于STM32F103ZET6的系统中,可以使用SPI接口来读取AS5047P编码器数据。 以下是基于STM32F103ZET6的SPI与AS5047P编码器的步骤: 1. 配置GPIO引脚:将SPI接口的SCK、MISO和MOSI引脚与STM32F103ZET6的GPIO引脚相连接。将AS5047P编码器的CS引脚与STM32F103ZET6的GPIO引脚相连接。 2. 初始化SPI接口:使用STM32F103ZET6的SPI库函数初始化SPI接口。配置SPI时钟速度和数据传输模式。 3. 初始化AS5047P编码器:使用SPI接口发送命令和参数初始化AS5047P编码器。在初始化过程中,需要设置编码器的分辨率、校准和滤波器等参数。 4. 读取AS5047P编码器数据:使用SPI接口发送读取命令,从AS5047P编码器读取角度数据。 5. 处理AS5047P编码器数据:将读取的角度数据转换为旋转角度。可以使用STM32F103ZET6的数学库函数进行角度计算和滤波。 6. 控制旋转电机:根据角度数据控制旋转电机的运动。可以使用STM32F103ZET6的定时器和PWM输出控制电机。 注意事项: 1. 在使用SPI接口时,需要注意时序和数据格式的配置。AS5047P编码器的SPI接口时序和数据格式需要与STM32F103ZET6的SPI接口匹配。 2. 在使用AS5047P编码器时,需要进行校准和滤波,以提高测量精度和稳定性。 3. 在控制旋转电机时,需要注意电机的驱动器和电源的配置,以确保电机安全稳定地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值