历史上的今天
今天是:2024年12月18日(星期三)
2019年12月18日 | AVR单片机定时计数器学习笔记分享
2019-12-18 来源:elecfans
定时计数器的结构与应用定时计数器(Timer/Counter)常用于计数、延时、测量 周期、频率、脉宽、提供定时脉冲信号等。在实际应用中,对于转速,位移、速度、流量等物理量的 测量,通常也是由传感器转换成脉冲电信号,通过使用定时计 数器来测量其周期或频率,再经过计算处理获得。
AVR的定时计数器接口功能: 通过定时计数器与比较匹配寄存器相互配合,生成占空比 可变的方波信号,即脉冲宽度调制输出PWM信号,可用于 D/A、马达无级调速控制、变频控制等。本文主要介绍的是AVR单片机定时/计数器学习笔记,具体的跟随小编来了解下。

AVR单片机定时/计数器学习笔记
定时/计数器1(16位)有普通模式、CTC模式、快速PWM模式、相位修正PWM模式等工作模式。
1、普通模式(设为溢出中断工作方式,向量号为9)
工作原理:在设定的时钟频率下,计数寄存器由初值逐次加1,当达到计数最大值(65535)时,溢出,执行中断子程序。
需要配置的寄存器:T/C1控制寄存器B(TCCR1B)、计数寄存器(TCNT1H和TCNT1L)、T/C1中断屏蔽寄存器(TIMSK)。
(1)由TCCR1B的bit2、bit1、bit0设置时钟频率(有内部和外部)
(2)由TCNT1H和TCNT1L设置计数初值(注意应先写H,再写L)
(3)由TIMSK的bit2设置中断使能(注意最后还应开启总中断SREG|=BIT(7))
编程时中断的声明 #pragma interrupt_handler 中断函数名:中断向量号
注意:在中断子程序中,应该再次装入计数初值,因为进入中断时计数初值变成了0。
2、CTC模式(需要用到OC1A、OC1B两个引脚)
应用:用于产生占空比为50%的方波信号

( N为分频系数 )
需要配置的寄存器:T/C1控制寄存器A(TCCR1A)、T/C1控制寄存器B(TCCR1B)、输出比较寄存器1A(OCR1A)。
(1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们都设为,比较匹配时OC1A、OC1B电平取反)
(2)TCCR1B的bit4、bit3和TCCR1A的bit1、bit0组合来设置波形产生模式。(此处我们设为模式4—CTC模式)
(3)TCCR1B的bit2、bit1、bit0设置时钟频率。
(4)OCR1A用来设置计数的上限值
例程:
#include 《iom16v.h》
#include 《macros.h》
void main()
{
DDRD|=0X30; //PD4、PD5设为输出
TCCR1A=0X50; //比较匹配时取反
TCCR1B=0X09; //CTC模式,无预分频
OCR1A=1999; //OC1A、OC1B均产生2KHz的方波信号(系统时钟为8MHz)
}
3、快速PWM模式(需要用到OC1A、OC1B两个引脚)
前提:由TCCR1B的bit4、bit3和TCCR1A的bit1、bit0组合来设置波形产生模式为模式15(快速PWM)。

(1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们设为,OC1A比较匹配时取反;OC1B比较匹配时清零,TOP时置位)
(2)TCCR1B的bit2、bit1、bit0设置时钟频率。
(3)OCR1A用来设置计数的上限值,OCR1B用来设置计数的匹配值
例程1:
#include 《iom16v.h》
#include 《macros.h》
void main()
{
DDRD|=0X30;
TCCR1A=0X63; //15模式,OC1B比较匹配时清零,TOP时置1;OC1A匹配时取反
TCCR1B=0X1B; //64预分频
OCR1A=1249; //上限值,OC1B输出100Hz;OC1A输出50Hz方波
OCR1B=250; //匹配值,OC1B输出占空比为20%
}
例程2:
#include《iom16v.h》
#include《macros.h》
//产生38KHz 占空比为50%的信号
void main()
{
DDRD|=0X30;
TCCR1A=0X23; //配置寄存器,OC1A作为普通IO口;OC1B比较匹配时清零,TOP时置1
TCCR1B=0X19; //15模式,无预分频
OCR1A=209; //上限值,得到38KHz的PWM信号(OC1B口)
OCR1B=104; //匹配寄存器,2分之1的占空比
}
例程3:
#include《iom16v.h》
#include《macros.h》
//产生1Hz 占空比为50%的信号
void main()
{
DDRD|=0X30;
TCCR1A=0X23; //配置寄存器,OC1A作为普通IO口;OC1B比较匹配时清零,TOP时置1
TCCR1B=0X1D; //15模式,1024预分频
OCR1A=7811; //上限值,得到1Hz的PWM信号(OC1B口)
OCR1B=3905; //匹配寄存器,2分之1的占空比
下一篇:单片机延时程序基本知识汇总
史海拾趣
|
我有一颗芯片 ip210w由 8051内核和一个MAC组成 芯片手册有一句话:CPU starts up and runs instructions at address 0xFFFD of external Flash. 就是这句话把我郁闷了好久,怎么烧程序都不行。CPU都跑不起来。 请教高手如何让我的CPU跑起来,谢 ...… 查看全部问答> |
|
不能捕捉到CArchiveException 请各路英雄指教 大家好, 最近我遇到一个问题,在我的应用程序中(MFC工程), 里面有一句代码,是对文件读写的,如果这儿有一个空文件(里面什么内容也没有), 但我们又对它进行了读操作(调用CArchive >>进行读出),那么这儿一定会有个 CArchiveException异 ...… 查看全部问答> |
|
1.如题 ```` 2.还有就是如果一段时间没有数据传输 是不是就自动断开了? 3.断开后就可以继续发AT指令了么? 4.谢谢。。。。。… 查看全部问答> |
|
1、开始我使用的共享MFC库出错,后来我使用的静态MFC库,不出错了,,,但我在PB里已经向目标板加上了MFC组件,不知道为什么出错 2、我生成的EXE文件里如果有中文会显示乱码,不如应该如何解决 先谢谢了… 查看全部问答> |
|
今天调试板子,发现无法连接。第一个想到的是电源电压(焊DSP之前有测过电压都是对的)。 把所有的电容测了,发现RTS管脚处,用了一个RC 滤波电路。C上电压变成2.75V。去掉电容,DSP可连接。 将原本的4.7K,电阻换小后,电压上抬到3V左右。DSP工 ...… 查看全部问答> |
|
求助:建立了一个任务,就是不停进行打开、写、关闭、删除文件的操作,处于ready的状态,同时只有tShell处于ready状态,但spy后发现没有任何任务占用tick时间,中断也没有。该任务没执行。 出现这种情况是在建立任务后,在任务中输入i等指令后,就 ...… 查看全部问答> |
|
1.最基本的:系统开始运行OSStart()会引发一次调度 2.创建一个新任务时,如果此时系统在运行状态,则引发一次调度。3.某任务调用挂起函数挂起自己后引发一次调度。 4.调用恢复任务函数OSTaskResume()引发一次调度。 5.任务延时时,引发一次 ...… 查看全部问答> |




