OpenEdv-开源电子网

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

STM8S207 TIM1_PWM捕获,周期和低电平时间都不准,差2个us,求指导。

[复制链接]

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-12-25
在线时间
0 小时
发表于 2014-4-23 21:31:56 | 显示全部楼层 |阅读模式
用STM8S207 TIM1做PWM捕获实验,用的是内部时钟16经过8分频之后TIM1时钟为2M。

TIM2生产了38K,占空比为50%的PWM,TIM1捕获,利用STM32捕获的话周期为26us,低电平时间为13us,

利用STM8则周期为24us,低电平时间为12us,STM32捕获的也是STM8 TIM2产生的PWM。

下面是我的代码,求大神指教。
[mw_shl_code=c,true]void TIM1CH1_PWMIN(void) { TIM1_DeInit(); // 8分频,TIM1时钟为2M TIM1_TimeBaseInit(8, TIM1_COUNTERMODE_UP, 0xffff, 0); // CC1通道被配置为输入,IC1映射在TI1FP1上; TIM1->CCMR1 |= 0x01; // 使能输入捕获,TI1FP1下降沿触发 TIM1->CCER1 |= 0x03; // CC2通道被配置为输入,IC2映射在TI1FP2上; TIM1->CCMR2 |= 0x02; // 使能输入捕获,TI1FP2上升沿触发 TIM1->CCER1 |= 0x10; // 选择有效的触发输入信号:选源触发源 ti1fp1 触发方式:复位模式 TIM1->SMCR |= 0x54; // 使能中断ch1 ch2 TIM1->IER |= 0x06; TIM1_Cmd(ENABLE); } 中断函数: @far @interrupt void TIM1_CAP_COM_IRQHandler(void) { //TxData('#'); if( SET == TIM1_GetITStatus(TIM1_IT_CC1)) { TIM1_ClearITPendingBit(TIM1_IT_CC1); // 读取周期 IC1Value = TIM1_GetCapture1(); // 得到低电平时间 IC2Value = TIM1_GetCapture2(); if ((IC1Value != 0) && (IC2Value != 0)) { // 得到周期 freqduty_data[g_byFreqdutyCount][0] = IC1Value; // 得到低电平时间 freqduty_data[g_byFreqdutyCount][1] = IC2Value; g_byFreqdutyCount++; } else { // 无效数据 } if (10 == g_byFreqdutyCount) { DISABLE_38K; g_Flag = 1; } } [/mw_shl_code]

不忘初心,才能始终。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-23 22:50:19 | 显示全部楼层
是不是STM8运行速度的问题。
不一定是代码问题,硬件运行代码,响应中断,都是需要时间的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-12-25
在线时间
0 小时
 楼主| 发表于 2014-4-23 23:04:03 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我现在也是在想 是不是 STM8就只能做到这样的速度了。如果是这样的话,采用外部中断加定时器计数可不可行?
我担心外部中断+定时器会有误差才采用PWM捕获的。
不忘初心,才能始终。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-23 23:24:16 | 显示全部楼层
回复【3楼】Mars_wei:
---------------------------------
单纯计数,用定时器外部计数模式就可以了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-12-25
在线时间
0 小时
 楼主| 发表于 2014-4-23 23:33:53 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我主要是要采集过来脉冲的 周期和占空比,不知道这样的方式做可行?如果不可以的话,那上面那样的PWM捕获的方法有哪里可以改善呢?
不忘初心,才能始终。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-23 23:47:49 | 显示全部楼层
回复【5楼】Mars_wei:
---------------------------------
看上去没啥问题啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-12-25
在线时间
0 小时
 楼主| 发表于 2014-4-24 10:59:19 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
感谢原子哥,问题已经解决了,将TIM1 直接使用16M时钟就好了,不分频,1/16 us 和1/2us ,呵呵
不忘初心,才能始终。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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