#include "iostm8s208mb.h"//主控芯片的頭文件
/************************常用數據類型定義******************/
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
/*************************函數聲明區域*********************/
#define KEY4 PI_IDR_IDR0 // PWM檔位控制
void GPIO_init();
void delay(u16 Count);//延時函數聲明
void TIM1_PWM_SET(unsigned long F_PWM_SET);
//TIM1輸出比較功能初始化函數聲明
void CH1_PWM_SET(unsigned long F_SET_CH1,float Duty_CH1);
//TIM1_CH1通道PWM信號輸出配置函數聲明
void CH2_PWM_SET(unsigned long F_SET_CH2,float Duty_CH2);
//TIM1_CH2通道PWM信號輸出配置函數聲明
void CH3_PWM_SET(unsigned long F_SET_CH3,float Duty_CH3);
//TIM1_CH3通道PWM信號輸出配置函數聲明
void CH4_PWM_SET(unsigned long F_SET_CH4,float Duty_CH4);
//TIM1_CH4通道PWM信號輸出配置函數聲明
/**************************主函數區域**********************/
int main(void)
{
GPIO_init();
CLK_CKDIVR=0x00;//設置系統時鐘為HSI內部高速16MHz時鐘
delay(10);//延時等待穩定
TIM1_PWM_SET(16000);//TIM1輸出比較功能初始化配置
while(1)
{
//添加用戶自定義代碼
}
}
/****************************************************************/
//延時函數delay(),有形參Count用于控制延時函數執行次數,無返回值
/****************************************************************/
void delay(u16 Count)
{
u8 i,j;
while (Count--)//Count形參控制延時次數
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
/****************************************************************/
//TIM1輸出比較功能初始化函數TIM1_init(),有形參F_PWM_SET,無返回值
/****************************************************************/
void TIM1_PWM_SET(unsigned long F_PWM_SET) //用于控制功率 高中低
{
double PWM_abc[]={0.9,0.6,0.3};
u16 num;
TIM1_ARRH=F_PWM_SET/256; //配置自動重裝載寄存器高位“ARRH”
TIM1_ARRL=F_PWM_SET%256; //配置自動重裝載寄存器低位“ARRL”
TIM1_CR1&=0x8F; //向上計數模式邊沿對齊
while(1)
{
if(KEY4==0)
{
delay(20);
if(KEY4==0)
{
while(!KEY4);
num++;
}
switch(num)
{
case 1: TIM1_ARRH=F_PWM_SET/256; //配置自動重裝載寄存器高位“ARRH”
TIM1_ARRL=F_PWM_SET%256; //配置自動重裝載寄存器低位“ARRL”
TIM1_CR1&=0x8F;
CH1_PWM_SET(F_PWM_SET,PWM_abc[0]);//配置通道1輸出信號占空比20%
TIM1_CR1|=0x01;//使能TIM1計數器功能“CEN=1”
TIM1_BKR=0x80;//打開“主輸出”開關輸出PWM信號“MOE=1”
break;
case 2: TIM1_ARRH=F_PWM_SET/256; //配置自動重裝載寄存器高位“ARRH”
TIM1_ARRL=F_PWM_SET%256; //配置自動重裝載寄存器低位“ARRL”
TIM1_CR1&=0x8F;
CH1_PWM_SET(F_PWM_SET,PWM_abc[1]);//配置通道2輸出信號占空比40%
TIM1_CR1|=0x01;//使能TIM1計數器功能“CEN=1”
TIM1_BKR=0x80;//打開“主輸出”開關輸出PWM信號“MOE=1”
break;
case 3: TIM1_ARRH=F_PWM_SET/256; //配置自動重裝載寄存器高位“ARRH”
TIM1_ARRL=F_PWM_SET%256; //配置自動重裝載寄存器低位“ARRL”
TIM1_CR1&=0x8F;
CH1_PWM_SET(F_PWM_SET,PWM_abc[2]);//配置通道2輸出信號占空比40%
//CH2_PWM_SET(F_PWM_SET,0);//配置通道1輸出信號占空比20%
//CH3_PWM_SET(F_PWM_SET,0);//配置通道1輸出信號占空比20%
TIM1_CR1|=0x01;//使能TIM1計數器功能“CEN=1”
TIM1_BKR=0x80;//打開“主輸出”開關輸出PWM信號“MOE=1”
num=0;
break;
default: break;
}
}
}
}
/****************************************************************/
//TIM1_CH1通道PWM信號輸出配置函數CH1_PWM_SET(),有形參F_SET_CH1、
//Duty_CH1,F_SET_CH1用于配置捕獲/比較寄存器1高低位,Duty_CH1用于
//配置PWM信號占空比,無返回值
/****************************************************************/
void CH1_PWM_SET(unsigned long F_SET_CH1,float Duty_CH1)
{
float a;//變量用于占空比計算
a=Duty_CH1*F_SET_CH1;//計算占空比參數
TIM1_CCR1H=((u16)(a))/256;//配置捕獲/比較寄存器1高位“CCR1H”
TIM1_CCR1L=((u16)(a))%256;//配置捕獲/比較寄存器1低位“CCR1L”
TIM1_CCMR1=0x60;//配置為PWM模式1
TIM1_CCER1&=0xFD;//配置CC1P=0,OC1信號高電平有效
TIM1_CCER1|=0x01;//配置CC1E=1,使能OC1輸出
TIM1_OISR|=0x01;//空閑狀態時OC1為高電平
}
/****************************************************************/
//TIM1_CH2通道PWM信號輸出配置函數CH2_PWM_SET(),有形參F_SET_CH2、
//Duty_CH2,F_SET_CH2用于配置捕獲/比較寄存器2高低位,Duty_CH2用于
//配置PWM信號占空比,無返回值
/****************************************************************/
void CH2_PWM_SET(unsigned long F_SET_CH2,float Duty_CH2)
{
float b;//變量用于占空比計算
b=Duty_CH2*F_SET_CH2;//計算占空比參數
TIM1_CCR2H=((u16)(b))/256;//配置捕獲/比較寄存器2高位“CCR2H”
TIM1_CCR2L=((u16)(b))%256;//配置捕獲/比較寄存器2低位“CCR2L”
TIM1_CCMR2=0x60;//配置為PWM模式1
TIM1_CCER1&=0xDF;//配置CC2P=0,OC2信號高電平有效
TIM1_CCER1|=0x10;//配置CC2E=1,使能OC2輸出
TIM1_OISR|=0x04;//空閑狀態時OC2為高電平
}
/****************************************************************/
//TIM1_CH3通道PWM信號輸出配置函數CH3_PWM_SET(),有形參F_SET_CH3、
//Duty_CH3,F_SET_CH3用于配置捕獲/比較寄存器3高低位,Duty_CH3用于
//配置PWM信號占空比,無返回值
/****************************************************************/
void CH3_PWM_SET(unsigned long F_SET_CH3,float Duty_CH3)
{
float c;//變量用于占空比計算
c=Duty_CH3*F_SET_CH3;//計算占空比參數
TIM1_CCR3H=((u16)(c))/256;//配置捕獲/比較寄存器3高位“CCR3H”
TIM1_CCR3L=((u16)(c))%256;//配置捕獲/比較寄存器3低位“CCR3L”
TIM1_CCMR3=0x60;//配置為PWM模式1
TIM1_CCER2&=0x3D;//配置CC3P=0,OC3信號高電平有效
TIM1_CCER2|=0x01;//配置CC3E=1,使能OC3輸出
TIM1_OISR|=0x10;//空閑狀態時OC3為高電平
}
/****************************************************************/
//TIM1_CH4通道PWM信號輸出配置函數CH4_PWM_SET(),有形參F_SET_CH4、
//Duty_CH4,F_SET_CH4用于配置捕獲/比較寄存器4高低位,Duty_CH4用于
//配置PWM信號占空比,無返回值
/****************************************************************/
void CH4_PWM_SET(unsigned long F_SET_CH4,float Duty_CH4)
{
float d;//變量用于占空比計算
d=Duty_CH4*F_SET_CH4;//計算占空比參數
TIM1_CCR4H=((u16)(d))/256;//配置捕獲/比較寄存器4高位“CCR4H”
TIM1_CCR4L=((u16)(d))%256;//配置捕獲/比較寄存器4低位“CCR4L”
TIM1_CCMR4=0x60;//配置為PWM模式1
TIM1_CCER2&=0x1F;//配置CC4P=0,OC4信號高電平有效
TIM1_CCER2|=0x10;//配置CC4E=1,使能OC4輸出
TIM1_OISR|=0x40;//空閑狀態時OC4為高電平
}
void GPIO_init(void)
{
PI_DDR_DDR0=0;//配置PI2端口為輸入模式
PI_CR1_C10=1;//配置PI2端口為帶上拉的輸入模式
PI_CR2_C20=0;//配置PI2端口外中斷禁止
|