OpenEdv-开源电子网

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

stm8 TIM1输入捕获测频

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-5-23
在线时间
3 小时
发表于 2012-5-23 22:08:44 | 显示全部楼层 |阅读模式
测量频率在 1k-2k之间,要求精度0.01%,也就是2kHZ, 0.2HZ。
在做的过程中,发现最大跳动在0.8HZ,不知道代码哪有问题,之后就用avr做了一个,能满足要求,
但我还是想用STM8,希望高人指点,谢谢!

代码如下:

#include "TIM1_Capture.h"
#include "includes.h"
#include "delay.h"

//u16 tab[200];

INT_CHARS ICValue1,ICValue2;
u8  cnt;
u8  TIM1_OVF_Num;
bool flag;


void TIM1_Init(void)
{
    GPIOC->DDR &= ~(1<<1); // 配置PC1为输入
    GPIOC->CR1 |= 1<<1;
    GPIOC->CR2 &= ~(1<<1);    
 
    // 开启TIM1时钟
    CLK->CKENR1 |= 0X80;
   
    TIM1->CNTRH = 0X00;
    TIM1->CNTRL = 0X00;
    TIM1->ARRH = 0Xff;
    TIM1->ARRL = 0Xff;
    TIM1->CR1 = 0X80; // 自动重装  
   
    TIM1->CCMR1 = 0X00;
    TIM1->CCER1 = 0X00;
    TIM1->CCMR1 |= 0X01;
    TIM1->CCER1 &= 0XFD; // 上升沿捕获

    TIM1->IER |= 0X03; // 允许TIM1捕获中断,更新中断
   
    TIM1->SR1 = 0x00;
    TIM1->SR2 = 0x00;
   
    TIM1->CR1 |= 0X01; // 使能TIM1
   
    TIM1->CCER1 = 0X01; // 使能捕获
}

u16 ComputeFreq(void)
{
    u16 temp;
    u32 sum;

    flag = FALSE;
    cnt = 0;
    TIM1_Init();
    while(!flag); // 等待100次捕获结束
   
    sum  = TIM1_OVF_Num;
    sum *= 65536;
    sum += ICValue2.x;
    sum -= ICValue1.x;
    sum /= 10;
    temp = 1600000000/sum;
     
    return temp;
}

#pragma vector=0x0E
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
    disableInterrupts();
   
    if(cnt==5)
    {
        ICValue1.FJ[0] = TIM1->CCR1H;
        ICValue1.FJ[1] = TIM1->CCR1L;
        flag = FALSE;
        TIM1_OVF_Num = 0;
    }
    else if(cnt==105)  // 100次捕获结束
    {
        ICValue2.FJ[0] = TIM1->CCR1H;
        ICValue2.FJ[1] = TIM1->CCR1L;
        flag = TRUE;
        TIM1->CR1 &= 0XFE; // 失能TIM1
        TIM1->CCER1 = 0X00;
    }
   
    TIM1->SR1 &= 0xFD;
//    TIM1->SR2 = 0x00;
   
    cnt++;

    enableInterrupts();
}

#pragma vector=0x0D
__interrupt void TIM1_OVF_IRQHandler(void)
{
    disableInterrupts();
   
    TIM1_OVF_Num++;
    TIM1->SR1 &= 0xFE;
//    TIM1->SR2 = 0x00;

    enableInterrupts();
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 01:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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