OpenEdv-开源电子网

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

【V3.5库】TIM_ICPolarity_BothEdge无效。如何用简单办法、只捕捉四路PWM的“高电平时间”

[复制链接]

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
发表于 2015-3-12 11:52:28 | 显示全部楼层 |阅读模式
5金钱
——因为需要 捕捉 四路 PWM 信号——的【高电平时间】——

基本的思路是这样——让 CNT
自由的 从0 到 FFFF 计满 之后自己 归 0。
被测量的 PWM 高电平 时间 —— 远远小于 这个 【自然溢出的周期】。

这样:上升沿“捕捉中断”一次,记录下“捕捉寄存器”的数值=MyCH1_Up变量中,
         下降沿“捕捉中断”一次,记录下“捕捉寄存器”的数值=MyCH1_Dn变量中。
——— 两者之差 就是 “高电平时间”,回头再处理【自然溢出】的问题。。。

可是问题出来了:实际情况 并非 双边 捕捉 啊。以前有人也提问过。
关键是【3.5库】居然支持这种写法。。。编译也无错。。。

TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//TIM通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//上升沿和下降沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//输入1,2,3或4分别与IC1,2,3或4相连
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//每探测到1个边沿都捕获一次
TIM_ICInitStructure.TIM_ICFilter = 0x00;//输入捕获滤波器
TIM_ICInit(TIM4,&TIM_ICInitStructure);//初始化

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//TIM通道2
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//上升沿和下降沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//输入1,2,3或4分别与IC1,2,3或4相连
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//每探测到1个边沿都捕获一次
TIM_ICInitStructure.TIM_ICFilter = 0x00;//输入捕获滤波器
TIM_ICInit(TIM4,&TIM_ICInitStructure);//初始化

当然:繁杂一点,在 中断里 不断的修改捕捉边沿的 上、下,是可以的,但是总觉得不可靠

人 写 软件 就是 要 简单===>可靠 啊。。越简单 越可靠。。。


最佳答案

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

 问题 全面 解决 —— 不得不 【软翻转】——希望这是最精简的代码。 ——IAR6.5  + V3.5库::工程包 另帖发布—— extern u32 MyTemp_1,MyTemp_2,MyTemp_3; extern u16 MyCap1,MyCap2,MyCap3,MyCap4,MyCH1_Up,MyCH2_Up,MyCH3_Up,MyCH4_Up; void TIM4_IRQHandler(void) {   // —————下面是捕捉1————   if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)   {     ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
 楼主| 发表于 2015-3-12 11:52:29 | 显示全部楼层
 问题 全面 解决 —— 不得不 【软翻转】——希望这是最精简的代码
——IAR6.5  + V3.5库::工程包 另帖发布——

extern u32 MyTemp_1,MyTemp_2,MyTemp_3;
extern u16 MyCap1,MyCap2,MyCap3,MyCap4,MyCH1_Up,MyCH2_Up,MyCH3_Up,MyCH4_Up;
void TIM4_IRQHandler(void)
{
  // —————下面是捕捉1————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);   
    if (BitTIM4_CCER(CC1P) == 0)                // 俺喜欢 位带区 操作。
    {
      MyCH1_Up = TIM4->CCR1;                    // 记录上升沿时刻的 CNT 数值。
      BitTIM4_CCER(CC1P) = 1;                   // 改变CC1捕捉为:下降沿=1
    }
    else        // 下降沿 才需要计算 宽度。
    {
      MyCap1 = TIM4->CCR1 - MyCH1_Up; // 当前数值 减去 上升沿数值 = 高电平宽度
     
      if ((MyCap1-1200)>3)      // 测试才用这代码 担心捕捉 有误差:宽限 3个点。
      {
        PB(3) = 0;                //  给 逻辑分析仪 提供指示 抓捕错误用。 
        MyTemp_2 ++;        // 全速 断点 在这里 抓捕错误。5分钟未抓到错误。
      }
      else PB(3) = 1;
     
      BitTIM4_CCER(CC1P) = 0;                   // 改变CC1捕捉为:上升沿=0
    }

  }
  // —————下面是捕捉2————全面相对应。。。略。。。

回复

使用道具 举报

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
 楼主| 发表于 2015-3-12 11:55:02 | 显示全部楼层
忘记 帖出 中断 程序里 B(3),,PB(4) _
extern u32 MyTemp_1,MyTemp_2,MyTemp_3;
extern u16 MyCap1,MyCap2,MyCap3,MyCap4;
void TIM4_IRQHandler(void)
{

  // —————下面是捕捉1————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  {
    MyCap1 = TIM_GetCapture1(TIM4);
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);    
    PB(3) = !PB(3);
    /* 设置新的CCRx值
    TIM_SetCompare1(TIM4, capture + Userdefined_Period);
    User_Application();   // 用户程序 */
  }
  // —————下面是捕捉2————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
  {
    MyCap2 = TIM_GetCapture2(TIM4);
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);    
    /* 设置新的CCRx值
    TIM_SetCompare1(TIM4, capture + Userdefined_Period);
    User_Application();   // 用户程序 */
  }
  // —————下面是捕捉3————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
  {
    MyCap3 = TIM_GetCapture3(TIM4);
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);    
    /* 设置新的CCRx值
    TIM_SetCompare1(TIM4, capture + Userdefined_Period);
    User_Application();   // 用户程序 */
  }
  // —————下面是捕捉4————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)
  {
    MyCap4 = TIM_GetCapture4(TIM4);
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);    
    /* 设置新的CCRx值
    TIM_SetCompare1(TIM4, capture + Userdefined_Period);
    User_Application();   // 用户程序 */
  }

  TIM_ClearITPendingBit(TIM4,TIM_IT_Update);    // 清除 65535自然溢出的中断。
    B(4) = !PB(4);

}

——————————————————————————————————————
可以看到::PB(4) 在 每一路 PWM 的 下降沿 都 翻转了 的。。程序逻辑 没错。
回复

使用道具 举报

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
 楼主| 发表于 2015-3-12 16:26:41 | 显示全部楼层
问题 逐步 解决中。。这是 软件可靠性 测试。。故意 让时间 错位。
因为 要在 中断内部 取 翻转 捕捉 的 上升  和  下降。马虎不得。。



  MyCap1 = 0x0435;
  MyCap2 = 0xFF85;
  MyCap3 = MyCap1 - MyCap2;     // 模拟【溢出】的时候 减法运算 无误。

// —————下面是捕捉1————
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);   
    if (BitTIM4_CCER(CC1P) == 0)            // 俺喜欢 位带区 自定义 操作,更直观。
    {
      MyCH1_Up = TIM4->CCR1;                    // 记录上升沿时刻的 CNT 数值。
      BitTIM4_CCER(CC1P) = 1;                   // 改变CC1捕捉为:下降沿=1
    }
    else        // 下降沿 才需要计算 宽度。
    {
      MyTemp_1 = TIM4->CCR1;        // 暂时保存
      MyCap1 = MyTemp_1 - MyCH1_Up; // 当前数值 减去 上升沿数值 = 高电平宽度
     
      if ((MyCap1-1200)>3)         // 担心 捕捉 有误差:宽限 3个点。
      {
        PB(3) = 0;        // 给逻辑分析仪 提供触发信号
        MyTemp_2 ++;                // 断点设置在这里 没发现问题
      }
      else PB(3) = 1;
     
      BitTIM4_CCER(CC1P) = 0;                   // 改变CC1捕捉为:上升沿=0
    }
    /* 设置新的CCRx值
    TIM_SetCompare1(TIM4, capture + Userdefined_Period);
    User_Application();   // 用户程序 */
  }
  // —————下面是捕捉2————
 
回复

使用道具 举报

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
 楼主| 发表于 2015-3-18 14:47:45 | 显示全部楼层
下载文件:——1520us宽频信号转窄频——Hex 文件。
输入使用:——PB6,7,8,9,输出使用:PA15,PB3,PB10,PB11。
——————— 各个通道 要按照以上 顺序对应 ————

PB6789入宽Pa15PB3_10_11出窄.hex

12.84 KB, 下载次数: 329

回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-3-2
在线时间
10 小时
发表于 2015-6-16 17:12:42 | 显示全部楼层
#define  TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)


库里面找到双边沿捕获的值寄存器的值0x000A,对应寄存中的第三位被保留了,看来只能自己配置了,之前我在这纠结了很久
回复

使用道具 举报

79

主题

534

帖子

0

精华

高级会员

Rank: 4

积分
756
金钱
756
注册时间
2014-9-30
在线时间
128 小时
 楼主| 发表于 2015-6-25 16:17:33 | 显示全部楼层
回复【6楼】Joyje:
---------------------------------
我是 实测 : 库 根本 无效,无法做到【BothEdge】 法国人意大利人 喜欢开玩笑。
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2023-2-2
在线时间
14 小时
发表于 2024-2-17 09:27:21 | 显示全部楼层
楼主您好 请问这个程序的工程还在吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 07:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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