PWM控制点击的停止,正转,反转
PWM_Init初始化void Pwm_Init(void) //PWMA的初始化
{
//1.时钟源选择这里不改,默认22.1184mhz
//2.时基单元选择
PWMA_PSCRH = (u8)(PWM_PSCR>>8); //1分频
PWMA_PSCRL = (u8)(PWM_PSCR);
PWMA_ARRH= (u8)(PWM_ARR>>8);
PWMA_ARRL= (u8)(PWM_ARR);
PWMA_CCR1H= (u8)(PWM_CCR>>8);
PWMA_CCR1L= (u8)(PWM_CCR);
//3.输入输出的引脚配置
PWMA_ENO = 0X00;
PWMA_ENO |= 0X01; //使能PWM1p通道输出
PWMA_ENO |= 0X02; //使能PWM1n通道输出
PWMA_PS =0x00; //选择PWM1从P60引脚输出
PWMA_PS |= (2<<0);
//4.输入输出模式设置
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X68; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x05; //开启输出比较通道
// PWMA_CCER1 |= 0x08; //
PWMA_DTR = 175; // 10us死区时间
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1 |= 0X01; //启动计数器
}
Pwma1_Set单路pwm输出
void Pwma1_Set(int pwm)
{
if(pwm == 0) //电机停止
{
// 1p ,1n均为低电平
PWMA_CCR1H = 0; // 清空通道(输出通道关闭)
PWMA_CCR1L = 0; // 清空通道(输出通道关闭)
PWMA_ENO &= 0XFC; // 关闭1p,1n通道(不影响别的通道用的&符合)
PWM1P = 0;
PWM1N = 0;
}
else if(pwm > 0) //电机正转
{
if(pwm > (PWM_ARR+1))
{
pwm = (PWM_ARR+1);
}
PWMA_CCR1H= (u8)(pwm>>8);
PWMA_CCR1L= (u8)(pwm);
PWMA_ENO &= 0XFC; // 关闭1p,1n通道(不影响别的通道用的&符合)
PWMA_ENO |= 0X01; //使能PWM1p通道输出
PWM1N = 0;
}
else if(pwm < 0) //电机反正
{
pwm = -pwm;
if(pwm > (PWM_ARR+1))
{
pwm = (PWM_ARR+1);
}
PWMA_CCR1H= (u8)(pwm>>8);
PWMA_CCR1L= (u8)(pwm);
PWMA_ENO &= 0XFC; // 关闭1p,1n通道(不影响别的通道用的&符合)
PWMA_ENO |= 0X02; //使能PWM1n通道输出
PWM1P = 0;
}
}调用上面的两个函数
void main() //程序开始运行的入口
{
// u8 i,j;
int pwm = 0;
sys_init(); //USB功能+IO口初始化
usb_init(); //usb库初始化
EUSB = 1;
Timer0_Init(); //定时器0初始化
EA = 1; //CPU开放中断,打开总中断。
while( DeviceState != DEVSTATE_CONFIGURED );
// delay_ms(2000);
P40 = 0;
Pwm_Init(); // PWM的初始化
while(1) //死循环
{
Pwma1_Set(pwm); //初始化参数
delay_ms(2);
if( bUsbOutReady )
{
// “0”“500”“-300”
pwm = atoi(UsbOutBuffer); //将接收到的文本字符串转化成有符号的整形变量
printf( "PWM比较值:%d\r\n",pwm);
// USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
memset(UsbOutBuffer,0,OutNumber);
}
if( TIM_10MS_Flag==1 ) //如果10ms到了
{
TIM_10MS_Flag = 0; //清空标志位
}
}
}
本代码试验箱和屠龙刀三.2共用。
页:
[1]