OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6925|回复: 3

各位大神,stm32ppm解码程序有些看不懂,求注释

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-7-31
在线时间
0 小时
发表于 2014-7-31 15:06:12 | 显示全部楼层 |阅读模式
5金钱

#include "PPM.h"fficeffice" />

#include "stm32f10x.h"

 

TIM_ICInitTypeDef  TIM_ICInitStructure;

void PM_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

 

/* TIM3 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

 

/* GPIOC clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

 

/* TIM3 chennel2 configuration: A.01 */

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

 

/* Enable the TIM3 global Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

 

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

 

TIM_TimeBaseStructure.TIM_Prescaler   = (72 - 1);

TIM_TimeBaseStructure.TIM_Period      = 0xffff;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

 

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

 

 

 

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

 

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

 

 

/* Enable the CC2 Interrupt Request */

TIM_ITConfig(TIM3,TIM_IT_CC1 |TIM_IT_CC2 |TIM_IT_CC3 |TIM_IT_CC4 , ENABLE);

/* TIM enable counter */

TIM_Cmd(TIM3, ENABLE);

}

 

uint16_t RecvCom[4];

uint16_t RecvCom_old[4]={0,0,0,0};

extern unsigned char Recv1_Flag,Recv2_Flag,Recv3_Flag,Recv0_Flag;

static char pulseState1 = 0,pulseState2 = 0,pulseState3 = 0,pulseState4 = 0;

uint16_t cal(uint32_t u1,uint32_t u2)

{

if(u1>u2)

return u1-u2;

else

return u1+0xffff-u2;

}

void TIM3_IRQHandler(void)

{

 

if (TIM3 ->SR & TIM_IT_CC1 ) 

{

TIM3 ->SR &= (~TIM_IT_CC1 );

if (pulseState1 == 0) 

        {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

RecvCom_old[0] = TIM_GetCapture1(TIM3 );

// TIM_SetCounter(TIM3,0);

}

        else 

        {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

// RecvCom[0] = (TIM_GetCapture1(TIM3 )-RecvCom_old[0]);

RecvCom[0] = cal(TIM_GetCapture1(TIM3 ),RecvCom_old[0]);

Recv0_Flag=1;

}

pulseState1 = !pulseState1;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

}

if (TIM3 ->SR & TIM_IT_CC2 ) {

TIM3 ->SR &= (~TIM_IT_CC2 );

if (pulseState2 == 0) {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

RecvCom_old[1] = TIM_GetCapture2(TIM3 );

 

} else {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

// RecvCom[1] = (TIM_GetCapture2(TIM3 )-RecvCom_old[1]);

RecvCom[1] = cal(TIM_GetCapture2(TIM3 ),RecvCom_old[1]);

Recv1_Flag=1;

}

pulseState2 = !pulseState2;

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

}

 

if (TIM3 ->SR & TIM_IT_CC3 ) {

TIM3 ->SR &= (~TIM_IT_CC3 );

if (pulseState3 == 0) {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

RecvCom_old[2] = TIM_GetCapture3(TIM3 );

 

} else {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

// RecvCom[2] = (TIM_GetCapture3(TIM3 )-RecvCom_old[2]);

RecvCom[2] = cal(TIM_GetCapture3(TIM3 ),RecvCom_old[2]);

Recv2_Flag=1;

}

pulseState3 = !pulseState3;

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

}

 

if (TIM3 ->SR & TIM_IT_CC4 ) {

TIM3 ->SR &= (~TIM_IT_CC4 );

if (pulseState4 == 0) {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

RecvCom_old[3] = TIM_GetCapture4(TIM3 );

 

 

} else {

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

// RecvCom[3] =( TIM_GetCapture4(TIM3 )-RecvCom_old[3]);

RecvCom[3] =cal( TIM_GetCapture4(TIM3 ),RecvCom_old[3]);

Recv3_Flag=1;

}

pulseState4 = !pulseState4;

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;

TIM_ICInit(TIM3, &TIM_ICInitStructure);

 

}

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-31 23:26:14 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-3-1
在线时间
1 小时
发表于 2016-3-5 02:14:51 | 显示全部楼层
通过STM32的输入捕获定时器,捕获ppm的上升沿和下降沿,计算时间,从而得到解码信息。PPM为Pulse Position Modulation,可译为脉冲位置调制,又称脉位调制.其组成多为头码+脉冲数.PPM以其编码方式简单,使用方便而曾经被广泛的使用在一些无线遥控系统中。有完整的程序更好分析。
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-29
在线时间
6 小时
发表于 2016-4-22 14:55:31 | 显示全部楼层
楼主有没有想到好办法,我之前做直接用延时的,用中断感觉都不太准,如果用PWM的话,每输出一个就得改下频率和占空比才可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表