使用STM32解析PPM接收机(CUBUMX HAL库 F103RCT6)

STM32CUBUMX的PPM接收机解析

有关PPM协议的细节,可以查看一文打尽接收机协议


本文使用的

  • 正点原子STM32F103RTC6
  • FS-I6遥控器
  • FS-RX2A接收机

基本

PPM解析使用下降沿触发外部中断后,使用定时器以1us进行计时,直到下一次的下降沿到来图片来自用stm32读取遥控器接收机PPM信号各通道值
可以看到,若油门处于最低时,接收的时间应该是1000us。处于最大时,为2000us。若接收时间大于2000us,则进入下一轮解析


CUBUMX配置

时钟等配置就按通常的来,不做赘述,本文只讲解析,可以参考【STM32】HAL库 STM32CubeMX系列学习教程
外部中断选择了PC8,配置如下
外部中断


注意在NVIC里勾选中断使能开关
打开中断


TIM2配置如下
TIM2时钟设置


使用串口来发送接收到的油门数据,配置如下
串口设置
配置完成后,生成代码。

程序


PPM.C

#include "ppm.h"

uint16_t PPM_Sample_Cnt = 0;//通道
uint8_t PPM_Chn_Max = 8;//最大通道数
uint32_t PPM_Time = 0;//获取通道时间
uint16_t PPM_Okay = 0;//下一次解析状态
uint16_t PPM_Databuf[8] = {0};//所有通道的数组

//PPM解析中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==GPIO_PIN_8)//判断是否为接收器产生的中断,例程设置为PIN8
    {
        PPM_Time = TIM2 ->CNT;//将定时数转存
        TIM2 -> CNT = 0;//计数器归零
        if (PPM_Okay == 1)//判断是否是新的一轮解析
        {
            PPM_Sample_Cnt++;//通道数+1
            PPM_Databuf[PPM_Sample_Cnt - 1] = PPM_Time;//把每一个通道的数值存入数组
            if (PPM_Sample_Cnt >= PPM_Chn_Max)//判断是否超过额定通道数
                PPM_Okay = 0;
        }
        if (PPM_Time >= 2050)//长时间无下降沿即无通道数据,进入下一轮解析
        {
            PPM_Okay = 1;
            PPM_Sample_Cnt = 0;
        }
    }
}

void TEST_send_message(void)
{
    for (uint8_t i = 0; i < PPM_Chn_Max; i++)
        printf("chn%d:%d\n", i+1, PPM_Databuf[i]);
    HAL_Delay(100);
}

ppm.h

#ifndef __PPM_H__
#define __PPM_H__

#include "gpio.h"
#include "tim.h"

void PPM_Init(void);
void TEST_send_message(void);

#endif /* __PPM_H__*/


重构串口发送函数

放到usart.c里

#include "stdio.h"
/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

main.c

开启定时器

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);
  /* USER CODE END 2 */

测试发送

    /* USER CODE BEGIN 3 */    
    TEST_send_message();

完成

测试


查看GITHUB代码


参考:

  1. 用stm32读取遥控器接收机PPM信号各通道值
  2. 【STM32】HAL库STM32CubeMX系列学习教程
对于使用STM32F103RCT6控制SG90舵机的问题,可以使用HAL库来实现。首先,需要初始化GPIO引脚和定时器。然后,可以编写一个函数来控制舵机的旋转角度。在这个函数中,可以计算PWM波形的高电平持续时间,并发送PWM波形来控制舵机的旋转角度。最后,可以在主函数中调用这个函数来控制舵机的旋转角度。 引用\[1\]中的示例代码展示了如何使用延时模拟PWM波形来控制SG90舵机的旋转,并封装成一个子函数。在这个示例代码中,使用STM32F10x系列的库函数来实现GPIO的初始化和控制,以及延时函数来模拟PWM波形的高电平持续时间。 引用\[2\]和引用\[3\]中提供了关于使用HAL库和定时器来实现延时函数的示例代码。可以参考这些示例代码来实现延时函数,并在舵机控制函数中使用该延时函数来控制PWM波形的高电平持续时间。 综上所述,可以使用HAL库和定时器来实现对SG90舵机的控制。首先需要初始化GPIO引脚和定时器,然后编写一个函数来计算PWM波形的高电平持续时间,并发送PWM波形来控制舵机的旋转角度。最后,在主函数中调用这个函数来控制舵机的旋转角度。 #### 引用[.reference_title] - *1* [基于STM32的智能饮水机系统设计](https://blog.csdn.net/xiaolong1126626497/article/details/131068553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车](https://blog.csdn.net/weixin_63303786/article/details/130153926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值