B001-Atmega16-定时器1-(ques=1)

发布者:VelvetDreamer最新更新时间:2022-02-14 来源: eefocus关键字:Atmega16  定时器1  波形 手机看文章 扫描二维码
随时随地手机看文章

Atmega16-定时器1的使用 step by step。

之前完成了定时器2的各项功能的测试后,这里就很容易做了。


编译环境:AVR Studio 4.19 +avr-toolchain-installer-3.4.1.1195-win32.win32.x86

芯片型号:ATmega16

芯片主频:8MHz


测试说明:

1、 OC1A和 OC1B引脚输出比较匹配的波形

2、 PA2在 TOV1中断时取反

3、 PA3在 OCF1A中断时取反

4、 PA5在 OCF1B中断时取反

5、 PA6在 ICF1中断时取反

------------------------------------------------------------------------------------------------------------------------------------


小结:

1、最好使用 CTC模式来做定时功能。

      因为这样就只需要设置OCR1A,不需要每次TOV1中断都要重新设置TCNT1的计数初值。

2、CTC模式下、OC1A和OC1B的频率由OCR1A或ICR1决定,OCR1A和OCR1B都用来控制OC1A和OC1B的相位。

      CTC模式下的脉冲频率最大可达4MHz。

3、快速/高频PWM用于:功率调节、整流、ADC

      当OCR1A/OCR1B超过TOP值时,依然有PWM波形输出:TCNT1=(OCR1A或OCR1B)&TOP时发生比较匹配

      可以得到相当精确的PWM频率和占空比,如38KHz、1/3占空比的红外载波

      可以用OC1A引脚输出类似CTC模式的方波

4、相位修正对称用于:电机控制   

      修改TOP值可能导致上升斜坡和下降斜坡长度不一致,导致一个周期的波形不对称。

      结果就是占空比超出预期或低于预期。

      如果这有影响,就应该使用相位与频率修正PWM来做TOP值/频率可变的PWM。

5、相频修正PWM,其作用与意义有待理解。


6、对于ICF1中断,还有异常,见question-001。



-------------------------------------------------------------------------------------------------------------------------------------

第一步: 普通模式

说明:

1、使用定时器1的作为定时器使用,每次溢出后PA2的电平取反,由此可得知溢出时间。


测试代码:

Drv_Timer.h

typedef enum 

{

    INT_MODE_TOV = 0,

    INT_MODE_OCF = 1,

    INT_MODE_ICF = 2,

    INT_MODE_OCF1A = 3,

    INT_MODE_OCF1B = 4

} TIMER_INT_MODE;

 

typedef enum 

{

    T1_COM_MODE_NONE       = 0,

    T1_COM_MODE_TOGGLE     = 1,

    T1_COM_MODE_CLEAR      = 2,

    T1_COM_MODE_SET        = 3,

 

    T1_WGM_NOMAL           = 0,

    T1_WGM_8_PHASE_PWM     = 1,

    T1_WGM_9_PHASE_PWM     = 2,

    T1_WGM_10_PHASE_PWM    = 3,

    T1_WGM_CTC             = 4,

    T1_WGM_8_FAST_PWM      = 5,

    T1_WGM_9_FAST_PWM      = 6,

    T1_WGM_10_FAST_PWM     = 7,

    T1_WGM_PHASE_FRQ_PWM_ICR1  = 8,

    T1_WGM_PHASE_FRQ_PWM_OCR1A = 9,

    T1_WGM_PHASE_PWM_ICR1    = 10,

    T1_WGM_PHASE_PWM_OCR1A   = 11,

    T1_WGM_CTC_ICR1          = 12,

    T1_WGM_SERVED            = 13,

    T1_WGM_FAST_PWM_ICR1     = 14,

    T1_WGM_FAST_PWM_OCR1A    = 15,

 

    T1_CLK_SOURCE_NONE     = 0,

    T1_CLK_SOURCE_CLK_1    = 1,

    T1_CLK_SOURCE_CLK_8    = 2,

    T1_CLK_SOURCE_CLK_64   = 3,

    T1_CLK_SOURCE_CLK_256  = 4,

    T1_CLK_SOURCE_CLK_1024 = 5,

    T1_CLK_SOURCE_T1_FALL  = 6,

    T1_CLK_SOURCE_T1_RAISE = 7

} TIMER1_MODE;

 

typedef enum 

{

    T1_ICP_FALL_EDGE       = 0,

    T1_ICP_RAISE_EDGE      = 1

} TIMER1_ICP;

Drv_Timer.c

// ==========================================================================================================

// 定时器1初始化

// 

// 参数:OCM1A_mode      通道A比较匹配/PWM输出模式选择

//       OCM1B_mode      通道B比较匹配/PWM输出模式选择

//       com_mode        工作模式/波形产生模式选择

//       clk_source      时钟源和预分频选择

// 

// PWM模式下、写TCCR1A时需要清除FOC1A/B

// 写TCCR1B时需要清除bit5

// 

// ==========================================================================================================

void Drv_Timer1_init(const uint8_t com_mode, const uint8_t OCM1A_mode, const uint8_t OCM1B_mode, const uint8_t clk_source)

{

    TCCR1A = ((OCM1A_mode & 0x03) << 6) |   // 通道A比较匹配/PWM输出模式选择

             ((OCM1B_mode & 0x03) << 4) |   // 通道B比较匹配/PWM输出模式选择

             ((com_mode   & 0x03) << 0);    // 工作模式/波形产生模式选择(WGM[11:10])

 

    TCCR1B = (((com_mode & 0x0C) >> 2) << 3)   |    // 工作模式/波形产生模式选择(WGM[13:12])

             ( (clk_source & 0x07)     << 0);       // 时钟源和预分频选择

}

 

// ==========================================================================================================

// TIMER1 中断使能

// 

// 参数:mode   = INT_MODE_TOV 或 INT_MODE_ICF 或 INT_MODE_OCF1A  或 INT_MODE_OCF1B

//       enable = ENABLE 或 DISABLE

// 

// 可以单独使能/禁止一种模式的中断

// 

// ==========================================================================================================

void Drv_Timer1_INT_Enable(const uint8_t mode, const uint8_t enable)

{

    if(INT_MODE_TOV == mode)

    {

        if(DISABLE == enable)

        {

            TIMSK &= ~(1 << TOIE1);

        }

        else

        {

            TIMSK |=  (1 << TOIE1);

        }

        TIFR |= (1 << TOV1);

        return ;

    }

    if(INT_MODE_OCF1A == mode)

    {

        if(DISABLE == enable)

        {

            TIMSK &= ~(1 << OCIE1A);

        }

        else

        {

            TIMSK |=  (1 << OCIE1A);

        }

        TIFR |= (1 << OCF1A);

        return ;

    }

    if(INT_MODE_OCF1B == mode)

    {

        if(DISABLE == enable)

        {

            TIMSK &= ~(1 << OCIE1B);

        }

        else

        {

            TIMSK |=  (1 << OCIE1B);

        }

        TIFR |= (1 << OCF1B);

        return ;

    }

    if(INT_MODE_ICF == mode)

    {

        if(DISABLE == enable)

        {

            TIMSK &= ~(1 << TICIE1);

        }

        else

        {

            TIMSK |=  (1 << TICIE1);

        }

        TIFR |= (1 << ICF1);

    }

}

 

// ==========================================================================================================

// TIMER1 溢出中断服务程序

// 

// ==========================================================================================================

ISR(TIMER1_OVF_vect)

{

    PORTA ^= (1 << PA2);

}

main.c

// ==========================================================================================================

// 主函数

// ==========================================================================================================

#include

#include

#include "watch_dog.h"

#include "Drv_Timer.h"

#include "_noinit.h"

#include "system.h"

#include "sys_timer.h"

#include "config.h"

 

// ==========================================================================================================

//  伪中断BADISR_vect

// 

// ==========================================================================================================

ISR(BADISR_vect)

{

    

}

 

// ==========================================================================================================

// main函数

// ==========================================================================================================

int main(void)

{

    // ---------

    // 关全局中断

    cli();

 

    // 系统初始化

    sys_init();

 

    // PA[5:2]初始化为输出0

    DDRA   =   (1 << DDA2) | (1 << DDA3) | (1 << DDA5) | (1 << DDA6);

    PORTA &= ~((1 << PA2 ) | (1 << PA3 ) | (1 << PA5 ) | (1 << PA6 ));

 

    // 定时器1 初始化:普通模式、COM1A不启用、COM1B不启用、8预分频

    Drv_Timer1_init(T1_WGM_NOMAL, T1_COM_MODE_NONE, T1_COM_MODE_NONE, T1_CLK_SOURCE_CLK_8);

    // 使能TOV1中断

    Drv_Timer1_INT_Enable(INT_MODE_TOV, ENABLE);

 

    // 开全局中断

    sei();

 

    // ---------

    while(1)

    {

    }

    return 0;

}

测试结果:

1、 PA2引脚电平每个 66ms翻转一次。

      定时器1溢出周期为 T = ((1.0/8000000)*1000000) * 8 * 65536 / 1000 = 65.536 ms。

      两者基本一致。

-------------------------------------------------------------------------------------------------------------------------------------

第二步: CTC模式

1、使用OCR1A作为TOP值:WGM[13:10] = 0100

说明:

TCNT1加计数到TCNT1 = OCR1A时,比较匹配A发生、OC1A引脚电平翻转,同时TCNT1会被清0。


TCNT1加计数到TCNT1 = OCR1B时,比较匹配B发生、 OC1B引脚电平翻转。


但是,如果OCR1A < OCR1B,那么因为在TCNT1 = OCR1A时、TCNT1会被清0,不会继续增加到更大的OCR1B,


所以OCF1B永远不会发生、OC1B引脚将永远不会翻转。


测试代码:

Drv_Timer.c中增加1个初值设置函数和2个中断服务函数:


// ==========================================================================================================

//      设置TCNT1、OCR1A、OCR1B的值

// 

// (1). 在比较匹配下、OCR1A、OCR1B需要在TCNT1被设置之后设置

//      相应的,ICP1也需要在TCNT1被设置之后设置

// 

// ==========================================================================================================

[1] [2] [3] [4]
关键字:Atmega16  定时器1  波形 引用地址:B001-Atmega16-定时器1-(ques=1)

上一篇:B001-Atmega16-看门狗WDT-(ques=1)
下一篇:B001-Atmega16-定时器2-(ques=4)

推荐阅读最新更新时间:2024-11-10 10:43

ZDS2022示波器百集实操视频之68:捕获欠幅波形的几种方法
大家好,之前我们在微社区中讨论了一个很有趣的话题:欠幅波形在ZDS2022示波器中可以用哪些触发方式触发呢?讨论很热烈,有说2种的,有说3种的,那么答案到底是几种呢?今天来揭晓答案! ZDS2022设计了种类多达11种基础触发及21种免费开放的协议(如:CAN、USB、IIC等常用协议)触发! 图1 欠幅触发 首先,第一种就是欠幅触发了!按下【Trigger】键,将触发方式设为普通,选择欠幅触发类型,脉冲类型选正向欠幅,限定符选无,实际上限定符是用来设置脉冲宽度的!短按触发旋钮可切换触发电平,旋转触发旋钮可上下调节触发电平,只有欠幅波形顶部位于TH与TL之间时,感兴趣波形才会稳定触发。 图2 触发电平图 第二种方法就是
[测试测量]
利用高带宽任意波形发生器实现脉冲激光器的精准控制
高功率脉冲激光器是许多科学和工程实验的核心技术,在光谱学、计量学、量子信息、原子物理学和材料研究领域中发挥驱动作用。为了能够可靠、一致地进行这些实验,研究人员需要以高精度、高灵活性和严格的时序控制来控制脉冲激光器。具有高采样率的泰克任意波形发生器 (AWG) 能够完成上述任务。 生成波形以引发并微调效应 科学家和工程师利用泰克的 AWG 能够生成各种形状(矩形波形、指数波形、线性和非线性频率调制的啁啾信号、高斯波形和自定义波形)的快速电压脉冲。通过在一个或多个同步通道上生成高分辨率和宽带宽信号,泰克 AWG 可以凭借卓越的保真度和精度来驱动激光二极管或电光调制器,从而使其创建出真实而复杂的信号场景,这些场景可以对定
[测试测量]
利用高带宽任意<font color='red'>波形</font>发生器实现脉冲激光器的精准控制
STM32F4_TIM输入波形捕获(脉冲频率)
Ⅰ、概述 本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。在引脚上刚好相反:一个输入、一个输出。 本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。间隔一定时间读取频率并通过串口打印出来。 当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。 笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚) 先看一下实例的实验现象:
[单片机]
STM32F4_TIM输入<font color='red'>波形</font>捕获(脉冲频率)
STM32高级控制定时器1学习
高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。 用途在于:测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。 具体如下: 16位上下,自动装载计数器。 16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间任意数值 4个独立通道: 输入捕获 输出比较 PWM生成 单脉冲模式输出 死区时间可编程的互补输出 使用外部信号控制定时器和定时器互连的同步电路 在指定数目的计数器周期之后更新定时器寄存器
[单片机]
示波器稳定触发的三个步骤
  用示波器捕捉了一个未知信号,波形却在不断抖动,以致眼花缭乱不知所措?如何能让波形乖乖听话稳定下来,该调档位还是换触发?别急,3个步骤教你稳定触发。   1.Auto确定波形的外貌 图1 接入波形   把信号接进 示波器 后我们对它还一无所知,所以第1步是要先用Auto功能,将波形捕捉下来。如图2,Auto功能会根据信号的幅值,自动确定垂直档位,把波形都包含进显示屏内,并把触发阈值设置在中间,这样,我们就对波形有了第一印象:波形幅值有多大。 图2 Auto自动捕捉   现在,我们能确定的有:波形幅值,垂直档位。   2.Stop了解波形特征   波形垂直方向的幅值特征确定了以后,接下来我们要确定水平方
[测试测量]
示波器稳定触发的三个步骤
AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03
四、ATMEGA16的定时/计数器 四—(03)、PWM测试实验 手控PWM测试实验 定时器T2通过比较寄存器OCR2后从OC2脚(PD7)输出PWM信号,从000~255共分256级,对应的输出电压为0.00~5.00V 下面是图片~原理以前早就说过了~~不再赘述~~ 然后就是程序: 不过从现在开始使用模块化变成了~~你懂得,为的就是用起来方便~~ 这里是主函数: //------------------------------------------------------------------------------ //手控PWM测试实验 //定时器T2通过比较寄存器OCR2后从OC2脚(PD7)输出PWM
[单片机]
AVR单片机(学习ing)—(四)、<font color='red'>ATMEGA16</font>的定时/计数器—03
基于ATmega16单片机的干式变压器智能温度控制器设计
简介: 本文讨论基于ATmega16单片机的干式变压器智能温度控制器设计,该温控仪功耗低、技术先进,功能完善,操作简单,性能可靠,能够在十分恶劣的电磁干扰 或高温环境长期稳定工作,是干式变压器理想的监控装置。 1工作原理 温控仪由温度监测、信号处理、输出控制三部分组成。系统框图如图1所示,它通过预埋在 变压器三相绕组中的三只铂电阻传感器获取绕组温度值,经信号调理电路处理后直接送入控制器的A/D转换输入端。微控制器根据信号数据及设定的各种控制参数,按照嵌入的软件控 制规律执行计算与处理,自动显示变压器绕组的温度值、输出相应的控制信号、控制风机的启停,并根据当前状态输出正常、报警和跳闸信号等,同时将各种数据通过RS-485传到
[单片机]
基于<font color='red'>ATmega16</font>单片机的干式变压器智能温度控制器设计
加速电路及其波形
加速电路及其波形 加速电容器C和三极管输入电阻R组成微分电路。在输入信号正跳变时,可提供比无加速电容大得多的正向基极电流,使三极管很快达到饱和,见图。在输入信号下跳时,又可提供很大的反向基极电流,使基区存储的电荷消散,三极管迅速进入截止状态。
[模拟电子]
加速电路及其<font color='red'>波形</font>

推荐帖子

UBOOT , NBOOT EBOOT 三者有什么区别?
UBOOT,NBOOTEBOOT三者有什么区别UBOOT,NBOOTEBOOT三者有什么区别?搜索老帖子吧。回答很多次了,UBOOT是什么东东?好像只在Linux下听说过,CE下有这个吗?bootloader与linux,wince之类操作系统是可以完全分开的,只不过wince和eboot联系比较紧密,实际上bootloader应该与系统完全不相关才好uboot在linux下有这个说法,并且在XXX网站有下载。nboot就是在2440/2410等的内部SRAM执行的
zl0801 嵌入式系统
请问有没有支持redhat9的无线网卡啊
请问有没有支持redhat9的无线网卡啊,我在市场上找的全部都是支持Windows的请问有没有支持redhat9的无线网卡啊对于CiscoAironet的无线网卡Redhat8.0支持很好USB接口的吗?不知,帮顶没遇到过这种情况.
oneforlove 嵌入式系统
预测: 3个二极管叫“一种超大电流直流防反接电路”
预测:3个二极管叫“一种超大电流直流防反接电路”还是发明专利,,,服了 除了是发明专利以外,申请人可是正经的科技有限公司,由不得你不服。不可能过初审的 不可能过初审的该公司要是申请个实用新型呢?那就过去了,然后就授权了。发明专利,初审可能能过,但过不去实审。实审可是要先交实审费的。特意看了下,两个专利都是无权-视为撤回状态,这两个专利要是通过了实在说不过去这个很多时候是被迫的,有些公司为申请ZF高新产业
PowerAnts 电路观察室
请教一个关于stm32用JLINK烧写的问题
keilMDKV3.7+JLINKV8,cpu为STM32F103ZE,程序下载时提示:Flashdownloadfailed-Cortex-M3。这是什么原因呢?请教一个关于stm32用JLINK烧写的问题看来这真的是个普遍问题,不知为什么不能引起版主注意呢?我被这个问题折磨了一个星期了。今天终于有了进展!! 我一直是用mdk+ulink2,用的好好的,前段时间有几个星期没有用,再用发现ulink2坏了,usb无法找到设备,找买家,已经过期了,买家让
pfxu stm32/stm8
如何确保PCB设计信号完整性
信号完整性是指信号在信号线上的质量,即信号在电路中以正确的时序和电压作出响应的能力。如果电路中信号能够以要求的时序、持续时间和电压幅度到达接收器,则可确定该电路具有较好的信号完整性。反之,当信号不能正常响应时,就出现了信号完整性问题。随着高速器件的使用和高速数字系统设计越来越多,系统数据率、时钟速率和电路密集度都在不断地增加。在这种设计中,系统快斜率瞬变和工作频率很高,电缆、互连、印制板(PCB)和硅片将表现出与低速设计截然不同的行为,即出现信号完整性问题。信号完整性问题能导致或
jdbpcb00 PCB设计
《CMake 构建实战-项目开发卷》分享1—编译构建基础
《CMake构建实战-项目开发卷》分享1编译构建基础导言本书第一章《构建之旅》,从命令行编译源程序,从程序由单一文件构成,到多个文件构成,再到程序连接到静态库文件,程序链接到动态库文件,非常详细的描述了目标构建的关系、构建书序。最后引入Boost库,构建一个依赖于第三方库的程序。回首我的嵌入式开发历史,吃了多少编译的亏,吭哧吭哧解决了多少编译相关的错误,但是没有形成一个系统的知识架构,非常遗憾。感谢本书作者为我补全了编译相关的一些知识。浅谈Makefile
CoderX9527 编程基础
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved