📄 pwm.c
字号:
//pwm
#include "includes.h"
/*******************************************************************
display the choice of pwm channel
"have Pwm Channel"
" 1,01 2,23 3,45
*******************************************************************/
INT8U iMenuPWM[] = {"Have Pwm Channel 1.01 2.23 3.45 "};
/********************************************************************
the PWM of Function
You can choice the one of PWMs,decide the cycle and duty.
********************************************************************/
void PWM_Func (void) {
for(;;) {
LcdWriteAll(iMenuPWM); //display PWM menu
while (KeyFlag == ON) {
KeyFlag = OFF;
if (ValueKey == Enter){InputPwmValue();}
else if (ValueKey == Exit) return; //if have exit key,go back
}
}
}
/***********************************************************************
***********************************************************************/
void InputPwmValue(void) {
INT8U flag = ON;
INT8U i=0;
INT8U DesignPwm[] = {"Channel: ,Period: ms,Duty: % "};
INT8U PwmData[5] = {0,0,0,0,0};
while (flag == ON) {
LcdWriteAll(DesignPwm);
DesignPwm[8] = (PwmData[0]+0x30); //change x to 'x'
DesignPwm[17] = (PwmData[1]+0x30);
DesignPwm[18] = (PwmData[2]+0x30);
DesignPwm[27] = (PwmData[3]+0x30);
DesignPwm[28] = (PwmData[4]+0x30);
while (KeyFlag == ON) {
KeyFlag = OFF;
if ((ValueKey>=0)&&(ValueKey<=9)) {PwmData[i] = ValueKey;i++;}
else if (ValueKey == Exit) {return;}
else if (ValueKey == Enter) {flag = OFF;}
else if (ValueKey == reset) {StopPWM01();StopPWM23();StopPWM45();}
}
}
switch (PwmData[0]) {
case 1 :
InitPWM01();
SetPWM01((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
StartPWM01();
break;
case 2 :
InitPWM23();
SetPWM23((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
StartPWM23();
break;
case 3 :
InitPWM45();
SetPWM45((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
StartPWM45();
break;
default:
break;
}
}
/****************************************************************************
* 注意 * 当总线频率为8MHz时, 且PWMCLK_PCLK1 = 0x0,选用时钟A,
PWMPRCLK_PCKA = 0x3,PWM一个周期的最小分度为一微妙
所以1ms = 1000,当倍频到24MHz时1ms为 3000
****************************************************************************/
/****************************************************************************
控制PWM01口,16位
****************************************************************************/
void SetPWM01(INT16U period, INT16U duty) {
/* if( duty < 3500 || duty > 5400) {
#if DEBUG == ON
//HAVE_AN_ERROR();
#endif
return;
} */
PWMPER01 = period;
PWMDTY01 = duty;
}
/*********************************************************************************/
void InitPWM01(void) {
PWMCTL_CON01 = 0x1; /* 连接PWM0 和 1 */
PWMPOL_PPOL1 = 0x1; /* 开始是高 */
PWMCLK_PCLK1 = 0x0; /* 选用时钟A, 一为SA */
PWMPRCLK_PCKA = 0x3; /* 把时钟A分为原来的8分之1 */
PWMCAE_CAE1 = 0x0; /* 左对齐 */
PWMCNT01 = 0x0; /* 清零 PWM计数器,置多少都一样 */
/* PWMSCLA = ?; 设置SA把时钟A分多少频,当你用SA的时候 */
}
/*********************************************************************************/
// 控制PWM23口,16位
/*********************************************************************************/
void SetPWM23(INT16U period, INT16U duty) {
if( period < 100 ) {
HAVE_AN_ERROR();
return;
}
PWMPER23 = period;
PWMDTY23 = duty;
}
/*******************************************************************************/
void InitPWM23(void) {
PWMCTL_CON23 = 0x1; /* 连接PWM 2 和 3 */
PWMPOL_PPOL3 = 0x0; /* 开始是低 */
PWMCLK_PCLK3 = 0x0; /* 选用时钟B, 一为SB */
PWMPRCLK_PCKB = 0x3; /* 把时钟B分为原来的8分之1 */
PWMCAE_CAE3 = 0x0; /* 左对齐 */
PWMCNT23 = 0x0; /* 清零 PWM计数器,置多少都一样 */
/* PWMSCLA = ?; 设置SA把时钟A分多少频,当你用SA的时候 */
}
/********************************************************************************
控制PWM45口,16位
********************************************************************************/
void SetPWM45(INT16U period, INT16U duty) {
if( period < 100 ) {
HAVE_AN_ERROR();
return;
}
PWMPER45 = period;
PWMDTY45 = duty;
}
/******************************************************************************/
void InitPWM45(void) {
PWMCTL_CON45 = 0x1; /* 连接PWM 4 和 5 */
PWMPOL_PPOL5 = 0x0; /* 开始是低 */
PWMCLK_PCLK5 = 0x0; /* 选用时钟B, 一为SB */
PWMPRCLK_PCKA = 0x3; /* 把时钟B分为原来的8分之1 */
PWMCAE_CAE5 = 0x0; /* 左对齐 */
PWMCNT45 = 0x0; /* 清零 PWM计数器,置多少都一样 */
/* PWMSCLA = ?; 设置SA把时钟A分多少频,当你用SA的时候 */
}
/*********************************************************************************/
// 控制PWM6口,8位
/*********************************************************************************/
void SetPWM6(INT8U period,INT8U duty){
PWMPER6 = period; //250 means 8KHz
PWMDTY6 = duty;
}
/**********************************************************************************/
void InitPWM6(void){
PWMPOL_PPOL6 = 1; //disign the pwm clock is the 1/24 bus clock,so pwm clock is 1MHz
PWMCLK_PCLK6 = 1;
PWMPRCLK_PCKB = 0x01;
PWMSCLB = 0x03;
}
/*********************************************************************************/
// 控制PWM7口,8位
/*********************************************************************************/
void SetPWM7(INT8U period,INT8U duty) {
PWMPER7 = period; //250 means 8KHz
PWMDTY7 = duty;
}
/*********************************************************************************/
void InitPWM7(void) {
PWMPOL_PPOL7 = 1;
PWMCLK_PCLK7 = 1;
PWMPRCLK_PCKB = 0x01;
PWMSCLB = 0x03;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -