⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwmdemo.c

📁 picc_18v 8.35pl35 PIC18系列单片机开发C编译器
💻 C
字号:
#include <pic18.h>
#include "pwmdemo.h"

void init(void);
void get_period(void);
void get_dutycycle(void);
void update_pwm(void);

unsigned int DUTYCYCLE=0x0080;
unsigned char PERIOD=0xFF;
unsigned int PERCENTAGE;
unsigned char PRESCALE;

void main(void)
{
	init();
	while(1)
	{
		get_period();
		get_dutycycle();
		update_pwm();
		if (PERIOD==0) PERCENTAGE=0xFFFF;
		else	PERCENTAGE=(DUTYCYCLE*100/PERIOD);
	}
}

void init(void)
{
	GIE=0;		/* no interrupts are used */
	IPEN=0;
	
	TRISA=0x33;	/* pin 0 & 1 are analog inputs */
			/* pin 4 & 5 are inputs from DIP switch */	
	TRISC=0;	/* PORTC.2 is the output from PWM */
	ADCON1=0xC4;	/* configure A2D */
	
	CCP1CON=0x0F;	/* select PWM mode */
	
}

void get_dutycycle(void)
{
	ADFM=1;	/* need 10 bit result, right justify */
	ADCON0=0xC9;	/* select the channel of the duty cycle input pot */
	GODONE=1;
	while(!ADIF)continue;
	ADIF=0;
	DUTYCYCLE=ADRES/3;	/*right justified 10 bit result */
}

void get_period(void)
{
	ADFM=0;	/* period is an 8 bit value, left justify to get result from ADRESH */
	ADCON0=0xC1;	/* select the channel of the period input pot */
	GODONE=1;		/* start A2D */
	while(!ADIF)continue;
	ADIF=0;
	PERIOD=ADRESH;	/* Return 8 most signifigant bits of result */ 
}
		
void update_pwm(void)
{
	unsigned char dip_read;
/* update the PWM period */
	PR2=PERIOD;
/* update the PWM duty cycle */
	DC1B0=(bit)DUTYCYCLE;
	DC1B1=(bit)(DUTYCYCLE>>1);
	CCPR1L=(DUTYCYCLE>>2);
	
/* update the timer 2 prescaler */
	dip_read=DIP;
	
	if (dip_read == 0)
		PRESCALE=1;
	else if (dip_read == 1)
		PRESCALE=4;
	else PRESCALE=16;
	
	T2CON=(0x04+dip_read);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -