#include "SYSCFG.h";
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL(void)
{
OSCCON=0B01110001; //系统时钟选择为内部振荡器16MHz,分频比为1:1
INTCON=0; //禁止所有中断
PORTA=0B00000000;
PORTB=0B00000000;
PORTC=0B00000000;
WPUA=0B00000000; //弱上拉的开关,0-关,1-开
WPUB=0B00000000;
WPUC=0B00000000;
WPDA=0B00000000; //弱下拉的开关,0-关,1-开
WPDB=0B00000000;
WPDC=0B00000000;
TRISA=0B00000000; //输入输出设置,0-输出,1-输入,TIM1_CH1,PA0-输出
TRISB=0B00000000;
TRISC=0B00000000; //TIM1_CH1N,PC0-输出
PSRC0=0B11111111; //源电流设置最大
PSRC1=0B11111111;
PSRC2=0B00001111;
PSINK0=0B11111111; //灌电流设置最大
PSINK1=0B11111111;
PSINK2=0B00000011;
ANSELA=0B00000000; //设置对应的IO为数字IO
}
/*-------------------------------------------------
* 函数名:TIM1_INITIAL
* 功能: 初始化TIM1
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void TIM1_INITIAL(void)
{
PCKEN|=0B00000010; //使能TIMER1模块时钟
CKOCON=0B00100000; //Timer1倍频时钟占空比调节位4ns延迟
TCKSRC=0B00000001; //Timer1时钟源为HIRC
TIM1CR1=0B10000101; //允许自动装载,使能计数器
TIM1CR2=0B00000000;
TIM1SMCR=0B00000000;
TIM1ETR=0B00000000;
TIM1IER=0B00000000; //禁止所有中断
TIM1SR1=0B00000000;
TIM1SR2=0B00000000;
TIM1EGR=0B00000000;
TIM1CCMR1=0B01101000; //将通道1配置为输出,PWM模式1,开启TIM1CCR1H/L预装载功能
TIM1CCMR2=0B00000000;
TIM1CCMR3=0B00000000;
TIM1CCMR4=0B00000000;
TIM1CCER1=0B00001111;
TIM1CCER2=0B00000000;
TIM1CNTRH=0B00000000;
TIM1CNTRL=0B00000000;
TIM1ARRH=0x0A; //自动装载高8位03H
TIM1ARRL=0x6A; //自动装载低8位e8H
TIM1PSCRH=0B00000000; //分频
TIM1PSCRL=0B00000001;
TIM1RCR=0B00001111; //Bit[7:0]:重复计数器的值T1REP[7:0],(T1REP+1)对应着PWM周期的数目(边沿对齐模式下)
TIM1CCR1H=0X03; //PWM脉宽
TIM1CCR1L=0X1F;
AFP0 = 0B00000100;
TIM1BKR=0B11000000; //使能输出和互补输出,禁止刹车输入
TIM1DTR=0B00000111; //死区发生器设置,定义插入互补输出之间的死区持续时间为218.75ns
TIM1OISR=0B00000000; //空闲状态输出设置
LEBCON=0B00000000; //禁止前沿消隐
}
/*
PWM调节
周期:frequency
占空比:duty
*/
void CHANGE_PWM(unsigned int frequency, unsigned char duty) {
// 系统时钟16MHz / 预分频(2) = 8MHz
const unsigned long base_clock = 8000000; // 8MHz
unsigned int arr = (base_clock / frequency) - 1;
if (arr > 0xFFFF) arr = 0xFFFF;
if (arr < 0x01) arr = 0x01;
// 设置自动重装载寄存器
TIM1ARRH = arr >> 8;
TIM1ARRL = arr & 0xFF;
// 计算占空比
unsigned int ccr = (unsigned long)(arr + 1) * duty / 100;
// 设置比较寄存器
TIM1CCR1H = ccr >> 8;
TIM1CCR1L = ccr & 0xFF;
}
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
POWER_INITIAL(); //系统初始化
TIM1_INITIAL();
//CHANGE_PWM(2000, 50); // 频率调节
while(1)
{
NOP();
}
}