如何用pic单片机写TMR2定时器的应用,让LED一秒一秒的闪

如何用pic单片机写TMR2定时器的应用,让LED一秒一秒的闪,第1张

#include<pic.h>//TMR2定时器的应用,让LED一秒一秒的闪

//在使用定时计数器时一定要设置选项寄存器(OPTION_REG)和中断控制寄存器(INTCON)

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0x3B31)

uint initnum//定义一个溢出中断的变量

void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器

{

TRISD=0//输出状态

INTCON=0xc0//设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第二外设允许中断

PIE1=0x02//使能定时器1为00000010开中断,始终只用一最后一个其他的不用理会

TMR2=56//装初值,定时器2是8位的寄存器有256个数但是可以设定一个周期寄存器到了就可以溢出,如果不设周期寄存器就为256溢出,初值56则200us溢出

T2CON=0x04//设置预分频器和后分频器就是开始启到动定时器2这里都是1:1的比例

// T2CON=0x05//设置预分频器1:4和后分频器就是开始启到动定时器2这时候的时间是乘以后4倍,原本以200us产生一次中断现在则以800us产生一次中断,即800*1000的时间闪动

// T2CON=0x0d//设置预分频器1:4和后分频器1:2就是开始启到动定时器2这时候的时间是乘以后4倍,再乘以2倍,原本以200us产生一次中断现在则以1600us产生一次中断即1600*1000的时间闪动

// PR2=100设置周期寄存器,值设为100,到了就溢出,同时要将其初值设置为零才够精确,这也叫作PWM脉宽调制信号

}

void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1

{

init()

while(1)

{

if(initnum==1000)//它每200us产生溢出中断,1000次则是200ms

{

initnum=0//到了1s后清零

RD0=!RD0//取反,再到第二次溢出又取反电平

}

}

}

void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明

{ //例如:如果是TMR2IF置位才能知用是TMR2定时器,如果是T1IF置位才能知道是TMR1定时器

TMR2IF=0//先清零,同时知道是用TMR2定时器

TMR2=56

initnum++//加一

}

1. 关于编译器的9.8版本的使用。

(1) 按照专业软件文件夹9.8版本软件及使用方法安装即可。(记得OFF-LINE打勾)

(2)需要在mplab ide中选择HI-TECH Universal Toolsuite 然后路径一样指向picc.exe,这个时候编译的图标将变化为黑色和红色。

2. 关于配置位设置方法:如果是第一次 *** 作的话,建议看着数据手册进行在mplab ide菜单里面进行设置,配置完后,系统会根据你配置的,自动给出配置位的具体数据。记下然后,在程序里面最开始添加这样两行:

__CONFIG(0x0FA4)

__CONFIG(0x3AFF)

这样的好处是新建工程的时候,将这个源码添加进去的话,就不用再次设置了,编译器会根据这两行程序进行自动设置。

3. 关于16F1933的使用内部振荡的系统时钟设置

除了32MHz的系统时钟,都可以按照这样的步骤:

1)禁用4倍频(SPLLEN = 0),设置使用8MHz内部振荡IRCF<3:0>=1110,系统时钟选择位SCS<1:0>=1X或00

2)等待高频内部振荡器就绪 HFIOFR = 1

3)确定高频内部振荡器稳定 HFIOFS = 1 (精度至少为0.5%)

例程:

OSCCON = 0B01110000// 8MHz,INTOSC

while(!HFIOFR)

while(!HFIOFS)

4)如果需要设置32MHz,系统时钟选择为SCS<1:0>=1X,这里不能够=00;

例程:

OSCCON = 0B11110000// 32MHz,INTOSC

while(!HFIOFR)

while(!HFIOFS)

4. 在定时器2,4,6中,有TMRX与PRX有区别,作用分别是什么?后预分频有什么作用?

只使用TMRX的时候,可以用来装载一个初值来计数,直到溢出。

只使用PRX的时候,可以装载一个具体计数到次数,因为这里是当TMRX=PRX时,触发定时器X中断。使用PRX的好处是,可以在中断中省掉一条重新装载初值的语句,也就是实现了所谓的“自动重新装载计数器初值”。

后预分频的作用为,当你定时进入中断的周期为1ms,而后预分频设置为1/X的话,那么你实际进入中断的周期变为了Xms。由于定时器2,4,6不后预分频输出主要应用于CCP模块,它用作CCP模块在PWM模式下工作时的时基。

5. 由于我的应用中需要高的pwm分辨率,所以将使用32MHz的系统时钟

如果周期相同,是否可以使用相同的定时器?是否周期不同则需使用不同的定时器?

如果周期相同,则可以使用同一个定时器来产生PWM,周期不同的话必须使用不同的定时器。

6. 关于I/O口初始化,初始化不正确的话相应的功能不能正常使用。

是否一定要初始化ANSELA,ANSELB,APFCON这些关于I/O口相关的寄存器,他们各有什么用?

在关于备份管脚datasheet中说明有冲突,引脚图看上面CCP2可以配置到RC1或RB3,但是在具体说明寄存器作用的时候却说RC0和RB5,到底哪个是正确的?

ANSELA,ANSELB不配置对PWM产生没有影响,但是建议配置。APFCON一定需要正确配置。

当CCP2SEL =0时,PWM在RC1上面产生。

当CCP2SEL =1时,PWM在RB3上面产生。

当配置增强型PWM时,这个时候会用到P2BSEL,用来选择P2B输出管脚,CCP2/P2A可以配置到RC1或RB3,CCP2/P2B可以配置RC0和RB5。

7. 试试占空比两个极限值0%,100%的情况

当采用PRX=0xFF的时候,设置占空比100%会出现毛刺的情况.因为这个时候4*(255+1)=1024=0x400,数据已经溢出.是不是当分辨率达到10bit的时候,就不能完全按照占空比100%输出.

问题?

在使用PIC16F1933的时候,发现在采用10bit的PWM输出占空比为100%的时候,会有很多毛刺产生,而不采用10bit的PWM输出则没有毛刺。

个人分析了一下,我是采用定时器4来作为CCP1输出PWM的时基,需要采用10bit的PWM则PR4=0xFF,按照数据手册上面计算占空比的公式:100%=(CCPR4L:CCP4CON<5:4>)/(4*(PR4+1))

CCPR4L:CCP4CON<5:4>= 4*(PR4+1) = 4*(0xFF+1)=0x400=0B100 0000 0000

上面的寄存器是12bit的,而后面的计算结果为13bit的,是否这个原因造成输出占空比100%的10bit PWM而产生很多毛刺,故在实际项目的时候如果需要达到满占空比的话不能选择PRX=0xFF,选择PRX=0xFE。

8. 在调试串口的时候发现,当上电或者下电的时候会出现串口发送几个乱码的情况,可能是由于复位端口没有作为复位使用的原因,有待验证。

通过实验表明上电和下电的时候有可能发生乱码的原因是,在上电或者下电的过程中,可能在芯片确认上电电压附近抖动,造成芯片误判上电的情况出现而发生乱码。在配置位中有个PWRTE的寄存器,为使能上电延时定时器的,将这个寄存器配置为1,这种情况消失。另出现这个情况跟复位端口作为输入管脚没有关系。

9. 需要确认一个100us的函数,在非常短的延时上面可能用到。

32MHz的情况下 i=255,11.0592MHz的情况下i=89;

Void delay100us(void)

{

Uint8 i = 255

While(i--)

}

10. 关于DAC模块,精度如何?测试是否能够输出外部电压参考电压?

经过测试发现DAC输出的电压比理论值会小0.02V,ADC转换出来的值也会有同样的问题,阅读手册发现,固定电压输出的精度在±4%左右,由于这个方案对电压精度要求很高,不能够达到要求,需使用431作为外部参考。

另可以按照手册中的方法查看内部参考电压到底是多少,也就是可以输出到外部作为参考电压。

DACEN = 0

DACLPS = 1// 选择DAC正参考电压源

DACOE = 1// DACOUT输出

DACPSS0 = 0// 选择FVR作为参考电压,需设置FVRCON相应位

DACPSS1 = 1

DACNSS = 0// vss

DACCON1 = 31

内部参考电压设置为4.096时,实测值为4.089,这里表现出来精度不准还不明显。

当我内部参考电压设置为4.096,DACCON1 = 20,的时候,本来应该输出2.56V,实测2.543V,差了差不多0.02V


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11150903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存