标题STM32 通过定时器产生PPM信号

  • 说明:
    该代码基于STM32F103VET6 和STD标准库实现。若需要在其他单片平台使用需要调整IO,和定时器,底层代码。
    定时器要达到us级定时。
    实现原理是,将ppm 每个通道的高低电平脉宽时间,存入一个数组中。如PPM有用通道8个,分解高低电平脉宽时间为16个时间数据。
    通过定时器依次执行每个时间值。在定时执行时,根据信号特征改变IO电平,以达到输出PPM信号的目的。

  • 底层c文件

void ppm_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //ÍÆÍìÊä³ö50MHZGPIO_Init(GPIOA, &GPIO_InitStructure);
}/*** @brief  基本定时器初始化,用于非阻塞延时用.* @param  None* @retval None*/
void Timer_PPM_Tim5_Init(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = 999;   //499 == 5 ms 中断一次 TIM_TimeBaseStructure.TIM_Prescaler = 71; // TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM5, TIM_FLAG_Update);// TIM_ARRPreloadConfig(TIM7, DISABLE);TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);TIM_Cmd(TIM5, ENABLE);
}u16 ppm_value = 0;void Timer_PPM_Tim5_Time(u16 *timer)
{ppm_value = *timer;TIM_SetAutoreload(TIM5,*timer);
}void Timer_PPM_Tim5_Start(void)
{TIM_ClearFlag(TIM5, TIM_FLAG_Update);TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);TIM_Cmd(TIM5, ENABLE);
}void Timer_PPM_Tim5_Stop(void)
{TIM_ITConfig(TIM5, TIM_IT_Update, DISABLE);TIM_Cmd(TIM5, DISABLE);
}void TIM_PPM_Init(void)
{ppm_GPIO_Init();Timer_PPM_Tim5_Init();
}void TIM5_IRQHandler(void)
{if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){ppm_out_process();TIM_ClearITPendingBit(TIM5, TIM_FLAG_Update);}
}
  • *h文件
#ifndef __TIM_PPM_H
#define __TIM_PPM_H#define PPM_PIN PAout(0)void TIM_PPM_Init(void);
void Timer_PPM_Tim5_Start(void);
void Timer_PPM_Tim5_Stop(void);
void Timer_PPM_Tim5_Time(u16 *timer);#endif
  • 中间层c代码
/******************************************************************************** ****************************************************************************** 该部分功能实现需要开起一个1us中断一次的定时器,ppm_out_process()函数放在定时* 中断函数里面。* 主程序调用该函数ppm_MarkProcess()实现ppm数据的更新* 实现原理将:PPM理论上可以容纳10通道,但是有起始头等操作。所以占用一个通道的* 处理。最大也就容纳9个通道。根据通道的上升沿和下降沿找到20个标志时间点做跳变* 处理,输出PPM信号.* ***************************************************************************** ****************************************************************************/
#include "includes.h"#define PPM_OUT_L 0
#define PPM_OUT_H 1#define PPM_CH_NUB 8 //ppm通道数
#define PPM_FLAG_SPOT_NUB  18 //(PPM_CH_NUB *2 + 2)
#define PPM_CYCLE_TIME 20000 //us //50hz
#define PPM_LOW_TIME 400 //us#define LOCK   1
#define UNLOCK  0u8 Lock = UNLOCK;
u16 ppm_data_flag[PPM_FLAG_SPOT_NUB];PPM_Struct PPM = {ppm_init,ppm_out_process, //定时器回调函数ppm_MarkProcess,NULL,NULL,
};PPM_Bottom_Struct PPM_Bottom = {&PPM_PIN,TIM_PPM_Init,Timer_PPM_Tim5_Time,Timer_PPM_Tim5_Start,Timer_PPM_Tim5_Stop,
};//ppm数据初始化
void ppm_init(void)
{u8 i;for (i = 0; i < PPM_CH_NUB + 1; i ++){ppm_data_flag[i * 2 + 1] = PPM_LOW_TIME;}PPM_Bottom.Init();*(PPM_Bottom.PPM_OUT_PIN) = PPM_OUT_L;Delay_ms(1000);
}//ppm输出处理
void ppm_out_process(void)
{static u8 state = 0;//TIM_SetAutoreload(TIM5,ppm_data_flag[state]);PPM_Bottom.Time(&ppm_data_flag[state]);*(PPM_Bottom.PPM_OUT_PIN) = ~*(PPM_Bottom.PPM_OUT_PIN);state += 1;state %= PPM_FLAG_SPOT_NUB;
}//ppm数据输入填充处理
void ppm_MarkProcess(u16 *buf)
{u16 *p = &ppm_data_flag[2];//u32 cycleTime_flag_time = PPM_HERAD_TIME;u32 cycleTime_flag_time = 0;u8 i;Lock = LOCK;for(i = 0; i < PPM_CH_NUB; i ++){cycleTime_flag_time += buf[i];p[i * 2] = buf[i] - PPM_LOW_TIME;}ppm_data_flag[0] = PPM_CYCLE_TIME - cycleTime_flag_time - PPM_LOW_TIME;Lock = UNLOCK;p = NULL;
}
  • *h

#ifndef __PPM_H_
#define __PPM_H_//ppm 对外调用接口
typedef struct
{void (*Init)(void);void (*Out_process)(void);void (*MarkProcess)(u16 *buf);void (*Start)(void);void (*Stop)(void);
}PPM_Struct;//ppm 底层接口
typedef struct
{volatile unsigned long *PPM_OUT_PIN;void (*Init)(void);void (*Time)(u16 *timer);void (*Start)(void);void (*Stop)(void);
}PPM_Bottom_Struct;extern PPM_Struct PPM;void ppm_init(void);
void ppm_out_process(void);
void ppm_MarkProcess(u16 *buf);
#endif

STM32 通过定时器产生PPM信号相关推荐

  1. 用stm32读取遥控器接收机PPM信号各通道值

    引言 无人机遥控器接收机接收方式可以在遥控上设置成PPM模式和S.BUS模式,用示波器观察接收机信号输出引脚可以得到一系列的方波,很像PWM方波,而我们所需要的是七,八个或更多的通道信号,多路的PWM ...

  2. STM32解析航模遥控器的PPM信号

    一.前言 通常遥控器能输出i-BUS.s-BUS.PPM.PWM信号,其中i-BUS.s-BUS需要配套的电平反向器(硬件取反),PWM信号占用引脚较多,对比而言PPM信号使用起来更为方便. 航模遥控 ...

  3. STM32 四轴无人机设计——遥控器PPM信号

    1.前言 由于时间原因,我使用的遥控器是直接买的成品,富斯I6x+IA6B接收机,据说是一代神控,富斯的遥控器总共有ibus模式.sbus模式.PPM模式.我使用的是PPM模式. 2.什么是PPM P ...

  4. STM32 四轴无人机的设计——处理遥控器PPM信号

    1.前言 上一次我们已经成功接收并储存了从遥控器发送的PPM信号,但是你们知道遥控器的哪个通道对应PPM信号的哪一帧吗?没关系,我知道,哈哈,我自己测量了一下,将对应通道的数据帧位置统计了出来. 2. ...

  5. STM32F030F4P6 HAL库 PPM信号输出 24L01 PPM接收机制作

    事件起因 因为给PX4测试缺少遥控器,手撸了一套支持PPM的遥控器系统,这篇文章将在接收机上遇到的问题分享一二,供大家借鉴. 1.需求分析 接收机需要输出至少8通道的PPM信号,可以将*通PPM信号分 ...

  6. stm32高级定时器 基础知识

    stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...

  7. stm32关定时器_STM32F103ZET6的基本定时器

    1.定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8.STM32的定时器分为基本定时器.通用定时器和高等定时器. TIM6.TIM7是基本定时器.基本定时器是只能向 ...

  8. 单片机模拟输出PPM信号

    PPM信号就是将多个PWM信号放在一起传输,一个PPM的周期为20ms,其中一个通道信号的范围为1~2ms,所以一个PPM信号,最多可以传输10个通道的PWM信号. PPM信号以0.5ms的低电平信号 ...

  9. STM32之定时器详解

    STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 8个 ...

最新文章

  1. 第十六届全国大学生智能车竞赛线上比赛(广东+西南科技大学)成绩排名与获奖信息
  2. Keepalived 使用指南
  3. Python中两种文件修改的方式
  4. 前端学习(2617):删除品牌
  5. Loadrunner的基本概念
  6. LVS-DR工作原理图文详解(转载)
  7. Linux中scp报 not a regular file错误解决方案
  8. 【最后有彩蛋】Pyhton接口测试手册
  9. 【python gensim使用】word2vec词向量处理英文语料
  10. Apache commons-exec的使用
  11. 栈evaluate-reverse-polish-notation-leetcode练习题
  12. c语言的switch中case,c语言switch中case语句
  13. mac 语音召唤siri_在Mac上使用Siri可以做的11件事
  14. Java 面试题及答案
  15. 软件配置管理(SCM)
  16. JSP学习---jsp简介和理解jsp的本质
  17. 2022京东618活动有哪些玩法?京东618优惠福利有哪些?
  18. 隐私计算工程化之殇,为什么“久攻不破”?
  19. 读后感:黑衣人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十四)
  20. [STM32F7] 【分享评测】移植JAM Player到Nucleo-STM32F767ZI-144

热门文章

  1. 电脑桌面图标变成长方形咋办_为什么我的界面上的图标全部被一个长方形的图标覆盖了?...
  2. MT【354】又一道极值点偏移
  3. linux:awk之RS、ORS与FS、OFS
  4. 豆腐的做法与编辑的文风
  5. 常用PC,移动浏览器User-Agent大全
  6. [源码和文档分享]基于C语言实现的汽车牌照的快速查询
  7. 2022最新高通8155平台开源代码最新代码下载、编译方法
  8. JAVA-关于计算器的简单图形界面设计例子(不实现功能)
  9. SMEC98SP加密芯片方案实例
  10. win7计算机名怎么是感叹号,Win7系统wifi信号后出现感叹号怎么办 Win7连接wifi后出现感叹号三种原因和解决方法...