-
-
- void PWM_Init(void)
- {
- // 扩展寄存器
- P_SW2 |= 0x80;
-
- P0M0 |= 0x08; // P0.3 设为推挽
- P0M1 &= ~0x08;
- P1M0 |= 0x40; // P1.6 设为推挽
- P1M1 &= ~0x40;
-
- // ========== PWMA配置 (P1.6, 通道4P) ==========
- PWMA_CCMR2 = 0x68; // PWM模式1
- PWMA_PSCRH = 0x00;
- PWMA_PSCRL = 23; // 24MHz / (23+1) = 1MHz (1us每计数)
- PWMA_ARRH = 0x4E;
- PWMA_ARRL = 0x20; // 设为20000,精准对应20ms周期
- PWMA_CCR4H = 0x05; // 1.5ms (1500us) 中位
- PWMA_CCR4L = 0xDC;
- PWMA_CCER2 = 0x01; // CC4E=1, 使能通道4输出
- PWMA_ENO = 0x40; // ENO4P=1, 使能P1.6物理引脚输出
- PWMA_BKR = 0x80; // MOE=1, 主输出使能
- PWMA_CR1 = 0x81; // 启动计数器
-
- // ========== PWMB配置 (P0.3, 通道8_3) ==========
- // 选择PWM8的第3组映射(PWM8_3)输出到P0.3
- PWMB_PS &= ~0xC0; // 清除bit7-6
- PWMB_PS |= 0x80; // 设置C8PS=10 (对应第3组映射)
-
- PWMB_CCMR4 = 0x68; // 通道8配置为PWM模式1
- PWMB_PSCRH = 0x00;
- PWMB_PSCRL = 23; // 1MHz 计数频率
- PWMB_ARRH = 0x4E;
- PWMB_ARRL = 0x20; // 20ms 周期
- PWMB_CCR8H = 0x05; // 1.5ms 中位
- PWMB_CCR8L = 0xDC;
-
- PWMB_CCER2 = 0x01; // CC8E=1, 使能通道8输出
- PWMB_ENO = 0x80; // ENO8P=1, 使能P0.3物理引脚输出
- PWMB_BKR = 0x80; // MOE=1
- PWMB_CR1 = 0x81; // 启动计数器
- }
-
-
-
- // ========== 舵机控制函数 ==========
- void Servo1_SetAngle(unsigned char angle) // 舵机1: P0.3 (PWMB通道8)
- {
- unsigned int pulse;
- if (angle > 180) angle = 180;
- // 脉宽: 500us ~ 2500us, 步长 = (2500-500)/180 ≈ 11.11
- pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
- PWMB_CCR8H = (unsigned char)(pulse >> 8);
- PWMB_CCR8L = (unsigned char)(pulse & 0xFF);
- }
-
- void Servo2_SetAngle(unsigned char angle) // 舵机2: P1.6 (PWMA通道4)
- {
- unsigned int pulse;
- if (angle > 180) angle = 180;
- pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
- PWMA_CCR4H = (unsigned char)(pulse >> 8);
- PWMA_CCR4L = (unsigned char)(pulse & 0xFF);
- }
复制代码
舵机2,P1.6 (PWMA通道4) OK
舵机1,P0.3 (PWMB通道8) 舵机没反应
|