《2022年2022年简单的PWM程序 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年简单的PWM程序 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、写了一个简单的PWM 程序,给初学者, PWM+ 数字电表用 QL200 的 VR1作输入来调节占空比,并用D10,D11 来显示 VR1 输入到 RA0的电压,/ / Author : Toby / Date : 2009/01/21 / Function : 程序用于使 CCP1模块产生分辨率为10 位的 PWM波形,占空比可调 , / MCU : PIC16F877A / C Compiler : PICC 8.05 / IDE : MPLAB IDE v8.10 / #include _CONFIG(0 x3f3a); union adres / 定义一个共用体,用于存放10 位 A/
2、D 转换的结果int y1; unsigned char adre2; adresult; const char TABLE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0X82,0XF8,0X80,0X90; / 定义常数 0-9 的数据表格void CCP1INIT(void); void interrupt clkint(void); void adinitial_voltage(void); void display_voltage(void); void ini(void); void delay(unsigned char x); 名师资料总结 - -
3、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - unsigned char QC,TONOFF=5; unsigned int ad_data=0; / 主程序main() ini(); CCP1INIT(); /CCP1模块的 PWM 工作方式初始化 T2CON=4; / 打开 TMR2,且使其前预分频为1:1,后分频比为 1:1,但在这个程序中后分频比用不上while(1) CCPR1L=TONOFF; /CCPR1L 与 DC1B1 与 DC1
4、B0 共同组成占空比的可调范围,以当前程序为例,则占空比为 DC1B9:0)*Tosc*TMR2预分频QC=0; display_voltage(); adinitial_voltage(); void CCP1INIT() /CCP1 模块的 PWM 工作方式初始化子程序 */ CCP1CON=0X3C; / 设置 CCP1模块为 PWM 工作方式,且其占它比的低两位DC1B1 与 DC1B0为 11 INTCON=0X00; /禁止总中断和外围中断 PR2=150; /设置 PWM的工作周期 ,也即 PWM的工作频率其中 PWM周期=(PR2+1)*4*Tosc*TMR2预分频比 ,Tos
5、c 为MCU的振荡周期/ 以当前程序为例,则PWM 的输出频为1/(156+1)*4*0.25us(4M晶体)*1=6.3694267515923566878980891719745k 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - TRISC=RC2=0; /设置 CCP1引脚为输出方式 /A/D 转化初始化子程序void adinitial_voltage(void) unsigned char a=50; ad_data=
6、0; for(a;a-;) ADCON0=0B01000001; /A/D 转换器模块工作 ;但 AD 转换不进行 ;FOSC/8 ADCON1=0B11100000; /ADRESH 寄存器的高 6 位读为 0;6 位与 7 位须置 1 ADIF=0; /AD 转换中断标志先清出。while(ADGO); adresult.adre0=ADRESL; adresult.adre1=ADRESH; / 读取并存储 A/D 转换结果ad_data+=adresult.y1; ADGO=1; ad_data/=50; void display_voltage(void) / 电压显示函数 int
7、bai,shi,ge,qian,temp,change; / 定义 6 个临时变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - temp=ad_data/208.97959183673469387755102040816*1000; /10 位 AD1024,我的电源电压为4.9V,所心1024/4.9=208.9=209 TONOFF=(ad_data/208.97959183673469387755102040816)*2
8、5.000; change=temp; qian=temp/1000; / 求显示的千位bai=temp%1000/100; / 求显示的百位shi=(temp%100)/10; / 求显示的十位ge=temp%10; / 求显示的个位change=TABLEqian&0 x7f; / 显示一个小数点PORTD=change; PORTA=0B1111011; /RA2 输出低电平,点亮千位显示delay(1); PORTD=TABLEbai; / 查表得百位显示的代码PORTA=0 x37; /RA3 输出低电平,点亮百位显示delay(1); / 延时一定时间,保证显示亮度PORTD=TA
9、BLEshi; / 查表得十位显示的代码PORTA=0 x2F; /RA4 输出低电平,点亮十位显示delay(1); / 延时一定时间,保证亮度PORTD=TABLEge; / 求个位显示的代码PORTA=0 x1F; /RA5 输出低电平,点亮个位显示delay(1); / 延时一定时间,保证亮度PORTD=0 xff; void ini(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - TRISA=0B00000
10、001; TRISD=0; PORTD=0XFF; / 延时子程序void delay(unsigned char x) / 延时程序 unsigned char i,i=x; / 定义整形变量for(i=250;-i;); / 延时 void interrupt clkint(void) / 定时器中断函数 QC+; / 在这个函数中没有写TMRO=多少,主要目的是让TMR0 自由的溢出,这样计时更准确。T0IF=0 x0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -