- 打卡等级:以坛为家I
- 打卡总天数:322
- 最近打卡:2025-05-02 10:02:36
已绑定手机
金牌会员
- 积分
- 1041
|
用单片机控制两个舵机,按照教程设置后,PWM1P正常输出,但是怎么改设置PWM6都没有输出!现在我都改迷茫了,请帮忙看看
/*******************************************************
*定义输出管脚为:P10(PWM1P)和P21(PWM6)
*******************************************************/
#include "PWM.h"
#include "config.h"
#define PWM_PSC (120-1) //120分频
#define PWM_PERIOD 4000 //周期20毫秒
#define PWM_1_DUTY_0 108 //占空比2.7%
#define PWM_2_DUTY_0 216 //占空比5.4%
#define PWM_DUTY_90 300 //占空比7.5%
#define PWM_DUTY_135 400 //占空比10%
#define PWM_DUTY_180 500 //占空比12.5%
bit B_10ms;
*********************************************/
void PWM_Config(void)
{
PWMA_PS = 0x00; //0x00:默认引脚PWM1P=P1.0引脚
PWMB_PS = 0x00; //0x00:默认引脚PWM6= P2.1
PWMA_PSCRH = (u16)(PWM_PSC >> 8);
PWMA_PSCRL = (u16)(PWM_PSC); //PWM_PSC=119+1=实际预分频120
PWMB_PSCRH = (u16)(PWM_PSC >> 8);
PWMB_PSCRL = (u16)(PWM_PSC); //PWM_PSC=119+1=实际预分频120
//设置PWM的工作模式
PWMA_CCER1 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
PWMA_CCER2 = 0x00; //捕获/比较使能寄存器
PWMA_CCMR1 = 0x60; // 设置 CC1 为 PWM模式1
// PWMA_CCMR2 = 0x60; // 设置 CC2 为 PWM模式1
// PWMA_CCMR3 = 0x60; // 设置 CC3 为 PWM模式1
// PWMA_CCMR4 = 0x60; // 设置 CC4 为 PWM模式1
PWMA_CCER1 = 0x01; //0001 0001 使能 CC1 CC2通道
// PWMA_CCER1 = 0x05; //<-1P1N互补输出时0x05(0101); 0001 0001:使能 CC1P CC2P通道
PWMA_CCER2 = 0x00; //关闭不使用的引脚
PWMB_CCER1 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
PWMB_CCER2 = 0x00;
PWMB_CCMR1 = 0x60; // 设置 CC5 为 PWM模式1
PWMB_CCMR2 = 0x60; // 0110 0000设置 CC6 为 PWM模式1
// PWMB_CCMR3 = 0x60; // 设置 CC7 为 PWM模式2
// PWMB_CCMR4 = 0x70; // 设置 CC8 为 PWM模式2
PWMB_CCER1 = 0x11; //位: - - CC6P CC6E - - CC5P CC5E 使能 CC6通道
PWMB_CCER2 = 0x00; // 禁用 CC7 CC8通道
PWMA_CCR1H = (u8)(PWM_1_DUTY_0 >> 8); // 设置CC1占空比时间 占空比5%
PWMA_CCR1L = (u8)(PWM_1_DUTY_0);
// PWMA_CCR2H = (u8)(PWM_DUTY_45 >> 8); // 设置CC2占空比时间 占空比5%
// PWMA_CCR2L = (u8)(PWM_DUTY_45);
PWMB_CCR6H = (u8)(PWM_2_DUTY_0 >> 8); // 设置CC6占空比时间 占空比5%
PWMB_CCR6L = (u8)(PWM_2_DUTY_0);
PWMB_CCR5H = (u8)(PWM_2_DUTY_0 >> 8); // 设置CC5占空比时间 占空比5%
PWMB_CCR5L = (u8)(PWM_2_DUTY_0);
PWMA_ARRH = (u8)(PWM_PERIOD >> 8); // 设置PWMA周期20毫秒
PWMA_ARRL = (u8)(PWM_PERIOD);
PWMB_ARRH = (u8)(PWM_PERIOD >> 8); // 设置PWMB周期20毫秒
PWMB_ARRL = (u8)(PWM_PERIOD);
PWMA_ENO = 0x01; // 0101 0101 使能 PWM1P(P10) 2P(P54) 3P(P14) 4P(P16)端口输出
//0001 0101 关闭P16成功 0x56:0101 0110 切换到1N输出
PWMA_BKR = 0x80; // PWMA使能主输出
PWMB_ENO = 0x55; // 0101 0101 使能 PWM5 6 7 8 端口输出
PWMB_BKR = 0x80; // PWMB使能主输出
PWMA_CR1 = 0x01; // 启动PWMA定时器,向上计数模式
PWMB_CR1 = 0x01; // 启动PWMB定时器,向上计数模式
// PWMB_CR1 = 0x11; // 启动PWMB定时器,向下计数模式
}
//--------------------更新占空比-------------------------
//上下舵机:下底点108=2.7%;上顶点:456=11.4%;
//左右舵机:避让点:216=5.4%;工作点:488=12.2%;
//
//num=0 两舵机同时动作,num=1 舵机上下控制,num=2 舵机左右控制
void Up_pwm_Duty(u8 num,u16 DUTY1_num,u16 DUTY2_num)
{
static u16 duty1 = PWM_1_DUTY_0, duty2= PWM_2_DUTY_0;
PWM_POWR = 0; //开电源 这个开电源意思是平时不给舵机供电,供电时通过继电器给舵机供5v电压
delay_ms(2500);
//复位舵机
if(num==0)
{
PWMA_CCR1H = (u8)(PWM_1_DUTY_0 >> 8);
PWMA_CCR1L = PWM_1_DUTY_0;
PWMB_CCR6H = (u8)(PWM_2_DUTY_0 >> 8);
PWMB_CCR6L = PWM_2_DUTY_0;
}
//第一舵机 上下
if((num==1)&&(duty1!=DUTY1_num))
{
if(duty1<DUTY1_num)
{
while(duty1!=DUTY1_num)
{
duty1++;
PWMA_CCR1H = (u8)(duty1 >> 8);
PWMA_CCR1L = duty1;
delay_ms(14);
}
duty1=DUTY1_num;
}
else if(duty1>DUTY1_num)
{
while(duty1!=DUTY1_num)
{
duty1--;
PWMA_CCR1H = (u8)(duty1 >> 8);
PWMA_CCR1L = duty1;
delay_ms(14);
}
duty1=DUTY1_num;
}
}
//第二舵机
if((num==2)&&(duty2!=DUTY2_num))
{
if(duty2<DUTY2_num)
{
while(duty2!=DUTY2_num)
{
duty2++;
PWMB_CCR6H = (u8)(duty2 >> 8);
PWMB_CCR6L = duty2;
delay_ms(14);
}
duty2=DUTY2_num;
}
else if(duty2>DUTY2_num)
{
while(duty2!=DUTY2_num)
{
duty2--;
PWMB_CCR6H = (u8)(duty2 >> 8);
PWMB_CCR6L = duty2;
delay_ms(14);
}
duty2=DUTY2_num;
}
}
delay_ms(1500);
// PWM_POWR = 1; //关电源
}
|
|