|
楼主 |
发表于 2011-8-7 19:21
|
显示全部楼层
找到了N年前东城的资料,原来是通过占空比来实现的。
无极调光试验程序
单片机采用PIC12F683,这个单片机内部有硬件CCP单元,可以配置成PWM模式。为什么要用这个单片机,而不用别的型号,一来对PIC比较熟悉,二来买的到且不算贵。
12F683跟12F628一样,有SO-8封装的帖片,体积一样。设计IC的2、3脚分别对地接一个开关,2脚开关按下后,占空比增加,3脚开关按下后占空比减小。开机后初始值大概50%,PWM频率大概15.6KHz。PWM脉冲从IC的5脚输出。12F683的资料也是不多,仅有Datasheet可以参考,经过反复测试,终于用下面代码调试成功:
;----------------------------------------------------------
BSF STATUS,RP0
MOVLW 07H
MOVWF OPTION_REG ;允许上拉
MOVLW 30H
MOVWF WPU ;设置GP4、GP5弱上拉
MOVWF IOC ;设置GP4、GP5允许端口电平变化中断
BSF INTCON,GPIE
;----------------------------------------------------------
BCF STATUS,RP0
MOVLW 07H
MOVWF CMCON0 ;关闭比较器
;**********************************************************************
BSF STATUS,RP0
CLRF ANSEL ;清除模拟选择寄存器
MOVLW 3FH
MOVWF PR2 ;设置PR2,PWM周期,默认4M振荡输出PWM频率约15.6KHz
;----------------------------------------------------------
BCF STATUS,RP0
MOVLW 1FH
MOVWF CCPR1L ;设置占空比初值
;----------------------------------------------------------
BSF STATUS,RP0
MOVLW 0F8H
MOVWF TRISIO ;设置GP2输出
;----------------------------------------------------------
BCF STATUS,RP0
CLRF T2CON
BSF T2CON,TMR2ON ;设置T2CON使能,预分频比1
;----------------------------------------------------------
MOVLW 0FH
MOVWF CCP1CON ;设置CCP模块为PWM模式
;----------------------------------------------------------
BSF INTCON,GIE ;开启全局中断
LOOP GOTO LOOP
;**********************************************************************
GPINT BCF STATUS,RP0
BCF INTCON,GPIF ;清中断标志
BCF INTCON,GPIE ;关闭端口电平变化中断
BTFSC GPIO,04H
GOTO PR5
CALL DELAY30MS
BTFSC GPIO,04H
GOTO PR5
INCCCP MOVF CCPR1L,W
XORLW 3FH
BTFSC STATUS,Z
GOTO RETGPINT
INCF CCPR1L,F
BTFSC GPIO,04H
GOTO RETGPINT
CALL DELAY166MS
GOTO INCCCP ;GP4上的开关按下后占空比减小,如果持续按住不放,则占空比连续减小
;----------------------------------------------------------
PR5
BTFSC GPIO,05H
GOTO RETGPINT
CALL DELAY30MS
BTFSC GPIO,05H
GOTO RETGPINT
DECCCP MOVF CCPR1L,F
BTFSC STATUS,Z
GOTO RETGPINT
DECF CCPR1L,F
BTFSC GPIO,05H
GOTO RETGPINT
CALL DELAY166MS
GOTO DECCCP ;GP5上的开关按下后占空比增加,如果持续按住不放,则占空比连续增加
;----------------------------------------------------------
RETGPINT
BSF INTCON,GPIE ;打开端口电平变化中断
RETFIE ;中断返回
;**********************************************************************
其中红色的部分是必须加的,开始不知道,程序总是调不出来。反复读Datasheet后才知道,必须关闭AD模块和比较器模块,否则GP4、GP5就不能正常使用。
这个程序占空比变化只有63级,不过实际感觉也就是无极了。当然,程序再修改修改可以做到256级,这个试验程序只是改变CCPR1L寄存器的值,占空比低2位保存在CCP1CON的4、5位,程序没有处理这两位,都置零了。
下一步就要把CCPR1L保存到EEPROM中,实现记忆功能,再把更多功能做进去,就可以达到实用了。无极调光不是什么高技术,通过这个例程可以揭示出来了。:lol :lol :lol |
|