OpenEdv-开源电子网

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

stm32f103c8t6用TIM2的2通道检测输入电平的宽度

[复制链接]

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-10-7
在线时间
17 小时
发表于 2019-12-11 09:37:13 | 显示全部楼层 |阅读模式
1金钱
先检测起始码EZX_TestStart()。然后检测接下来的16脉冲宽度返回两个字节,用两次EZX_Receive(),
按理返回的为70,FF,但实际返回的为E0,FE,也就是返回的数据向左移动了一位,试过将EZX_Receive()中的while设置为7,但还是不行

//引脚初始化,定时器2计时65.536ms,
void EZX_Init()
{
//  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_InitStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  //输入捕获通道
  GPIO_InitStructure.GPIO_Pin = EZX1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //输出通道
  GPIO_InitStructure.GPIO_Pin = EZX0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  EZX_Reset;

  TIM_InitStructure.TIM_Period = 0xffff;
  TIM_InitStructure.TIM_Prescaler = 71; //1us
  TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
//  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //超时中断

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //PA1
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //捕获下降沿
  TIM_ICInitStructure.TIM_ICFilter = 0; //滤波
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕获信号分频数
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //输入通道
  TIM_ICInit(TIM2, &TIM_ICInitStructure);

  TIM_ClearFlag(TIM2, TIM_FLAG_CC2);
  TIM_Cmd(TIM2, ENABLE);

//  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelSubPriority  = 1;
//  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//  NVIC_Init(&NVIC_InitStructure);
}
//
////用做超时处理
//void TIM2_IRQHandler()
//{
//  while(TIM_GetITStatus(TIM2, TIM_IT_Update) == RESET);
//  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//}

//检测低电平的宽度
u16 EZX_TestWidthOfLow()
{
  u16 NumOfWidth;
  //边沿捕获
  if(TIM_GetFlagStatus(TIM2, TIM_FLAG_CC2) == SET) //第一次捕获到下降沿
  {
    TIM_ClearFlag(TIM2, TIM_FLAG_CC2);
    if(NumOfPolarity == 0) //第一次捕获到下降沿
    {
      NumOfPolarity++;
      TIM_OC2PolarityConfig(TIM2, TIM_ICPolarity_Rising); //设置成上升沿触发
    }
    else //第二次捕获到上升沿
    {
      NumOfPolarity = 0;
      NumOfWidth = TIM_GetCapture2(TIM2);
      TIM_OC2PolarityConfig(TIM2, TIM_ICPolarity_Falling); //设置成下降沿触发
    }
    TIM_SetCounter(TIM2, 0);
  }
  return NumOfWidth;
}

//检测起始码
u8 EZX_TestStart()
{
  u8 i = 0;
  u16 value = EZX_TestWidthOfLow();

  if((1600 <= value) && (value <= 1800)) //检测到起始码
    i = 1;

  return i;
}

//接收控制器命令
u8 EZX_Receive()
{
  u8 i = 0;
  u8 Byte = 0;
  u16 value;

  while(i < 8)
  {
    value = EZX_TestWidthOfLow();
    if((700 <= value) && (value <= 900)) //检测到逻辑0
    {
      i++;
      Byte <<= 1;
      //printf("%d ", value);
    }
    else if((1200 <= value) && (value <= 1400)) //检测到逻辑1
    {
      i++;
      Byte += 1;
      Byte <<= 1;
      //printf("%d ", value);
    }
  }
  printf("%d ",Byte);
  return Byte;
}


最佳答案

查看完整内容[请看2#楼]

其实是协议里面有问题,有两位不需要,没啥问题了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-10-7
在线时间
17 小时
 楼主| 发表于 2019-12-11 09:37:14 | 显示全部楼层
其实是协议里面有问题,有两位不需要,没啥问题了
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2019-12-11 10:21:27 | 显示全部楼层
https://github.com/WZTENG
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 22:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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