OpenEdv-开源电子网

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

输出捕获奇怪问题

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-14
在线时间
0 小时
发表于 2015-7-4 09:11:28 | 显示全部楼层 |阅读模式
原子哥以下程序怎么捕获频率老是不准?
使用STM8 16M时钟

TIM1自动装值为0xffff时代码标红底的地方,测1Khz 计数结果为15900左右.
TIM1的自动装入值改为0xff时, 同样测1Khz 计数结果为956左右.(这个结果有点相近)

这计数器装入值,难道会影响计算频率的吗?

void Hz_CounterConfig() //初始化Tim1 比较捕获通道2
{
/*端口初始化*/
GPIO_Init(HZ_COUNTER_PROT, HZ_COUNTER_PIN, GPIO_MODE_IN_PU_NO_IT);


TIM1_DeInit();
TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 0xffff, 0x00);


//频率计使用TIM1_CH2,信号从PD.4引脚引入
TIM1_ICInit(TIM1_CHANNEL_2, TIM2_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x00);

//启用捕获中断和更新中断
TIM1_ITConfig (TIM1_IT_UPDATE, ENABLE);
TIM1_ClearFlag (TIM1_FLAG_UPDATE);
enableInterrupts ();

/*TIM1_ITConfig(TIM1_IT_UPDATE|TIM1_IT_CC2, ENABLE);
TIM1_ClearFlag(TIM1_FLAG_UPDATE|TIM1_FLAG_CC2);
ITC_SetSoftwarePriority(ITC_IRQ_TIM1_CAPCOM, ITC_PRIORITYLEVEL_2);
enableInterrupts();*/
}

void Hz_CounterON() //启用输入捕获功能
{
i=0;
TIM1CH2_CAPTURE_VAL=0;

TIM1_ClearFlag(TIM1_FLAG_CC2|TIM1_IT_UPDATE);
TIM1_Cmd(ENABLE);
temp=0;

while(i<3)
{
//捕获第1次高电平
//TIM1_OC2PolarityConfig(TIM1_OCPOLARITY_HIGH);
TIM1_SetCounter(0);
while((TIM1->SR1 & TIM1_FLAG_CC2) != TIM1_FLAG_CC2);
//capt1 = TIM1_GetCapture2();
TIM1_ClearFlag(TIM1_FLAG_CC2);
TIM1_SetCounter(0);
TIM1CH2_CAPTURE_VAL=0;


//设置捕获下降沿
//TIM1_OC2PolarityConfig(TIM1_OCPOLARITY_LOW);

//捕获第2次高电平
while((TIM1->SR1 & TIM1_FLAG_CC2) != TIM1_FLAG_CC2);
TIM1_ClearFlag(TIM1_FLAG_CC2);
capt2 = TIM1_GetCapture2();
temp=TIM1CH2_CAPTURE_VAL*0xffff;
temp+=capt2;
value[i++]=temp;

if(TIM1CH2_CAPTURE_VAL>=0xffff) //257*255=65535待测频率溢出计数超出16位变量范围时将TIM1捕获频率降低
{
TIM1_Cmd(DISABLE);
TIM1_PRE*=10;
TIM1_TimeBaseInit(TIM1_PRE, TIM1_COUNTERMODE_UP, 0xffff, 0x00);
i=0;
TIM1_Cmd(ENABLE);
}
}
TIM1_Cmd(DISABLE);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-6-24
在线时间
0 小时
发表于 2015-7-6 09:59:04 | 显示全部楼层
main函数里面系统时钟有没有做如下初始化?
SystemClock_Init(HSE_Clock);
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-14
在线时间
0 小时
 楼主| 发表于 2015-7-6 13:43:44 | 显示全部楼层
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

//LED端口初始化
LED_Config();

//启用标准频率输出
Hz_Config();
//启用频率?
Hz_CounterConfig();
Hz_CounterON();


}
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-14
在线时间
0 小时
 楼主| 发表于 2015-7-6 13:44:09 | 显示全部楼层
main函数,我用的是内部时钟呀
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-8-11
在线时间
0 小时
发表于 2015-9-17 15:57:29 | 显示全部楼层
我也遇到了一样的问题,自动装值为0xffff是捕捉的值不对,改了自动装值为0xF000后就对了。不知道有什么关联。
回复 支持 反对

使用道具 举报

22

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-5-23
在线时间
118 小时
发表于 2016-7-13 10:56:59 | 显示全部楼层
用啥库都不知道,浪费空间,可读性一点也不好
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-7-1 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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