tohturusul 发表于 2023-9-6 16:25:16

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]
查看完整版本: PWM控制点击的停止,正转,反转