?? main.c
字號:
//-----------------------------------------------------------------
// 名稱: CCP1 PWM模式應用
//-----------------------------------------------------------------
// 說明: 本例運行過程中,通過可變電阻器可調節PWM占空比,
// 實現對電機速度的調節
// (本例PWM頻率被固定設為400Hz)
//
//-----------------------------------------------------------------
#include <pic.h>
#define _XTAL_FREQ 4000000UL
#define INT8U unsigned char
#define INT16U unsigned int
int x, x0, PWM_ON_Time ,pre_ADC0_result = 0;
//-----------------------------------------------------------------
// ADC初始化
//-----------------------------------------------------------------
void Init_ADC()
{
TRISA0 = 1; //模擬輸入
}
//-----------------------------------------------------------------
// 對通道ch進行模數轉換,返回10位精度的轉換結果
//-----------------------------------------------------------------
int ADC_Convert(INT8U ch)
{
//設置ADCON0寄存器的通道選擇位CHS[2..0]=Channel(0~7)
//選擇通道后等待
//開始轉換--->等待,直到一次轉換結束(ADGO還可替換成GODONE)
//讀取轉換結果,并轉換為電壓值
}
//-----------------------------------------------------------------
// PWM初始化
//-----------------------------------------------------------------
void Init_PWM()
{
//RC2/CCP1為輸出
//設置PWM模式
//設置T2CON預分頻位為T2CKPS[1:0]=1X,將TMR2預分頻率比設為1:16
//根據公式PWM頻率=[(PR2) + 1] * 4 * TOSC * (TMR2預分頻值)
//求出PR2,設置PWM頻率為400Hz(2500us PWM周期)
//TMR2啟動
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
Init_ADC(); __delay_ms(100); //ADC初始化
Init_PWM(); //CCP1模塊PWM模式初始化
while(1)
{
//獲取AN0通道模數轉換結果
//如果模數轉換值變化則修改PWM占空比,調節電機轉速
if (x0 != pre_ADC0_result)
{
//保存最近一次模數轉換結果
//首先將模數轉換結果轉換為PWM ON時間(PWM周期為2500us)
//再根據PWM ON時間計算公式得出10位的CCPR1L與CCP1CON<5,4>
//設10位的CCPR1L與CCP1CON<5,4>為x;
//其中由1M振蕩頻率得TOSC = 0.25us
//根據公式有: PWM_ON_Time = x * 0.25 * TMR2分頻值,可得:
//將變化后的x寫入10位的CCPR1L與CCP1CON<5,4>,
//其中CCP1CON<5,4>即CCP1X/CCP1Y改變占空比,實現PWM調速
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -