我是靠谱客的博主 甜美灯泡,最近开发中收集的这篇文章主要介绍使用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:%dn", 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系列学习教程

最后

以上就是甜美灯泡为你收集整理的使用STM32解析PPM接收机(CUBUMX HAL库 F103RCT6)的全部内容,希望文章能够帮你解决使用STM32解析PPM接收机(CUBUMX HAL库 F103RCT6)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部