找回密码
 立即注册
查看: 319|回复: 9

AI8H1K08单片机外围引脚怎么用

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-16 15:44:08 | 显示全部楼层 |阅读模式
使用AI8H1K08单片机,P1.2 P1.3 P1.4分别控制3个呼吸灯,P1.6和P1.7采集外边输入信号  P1.0和P1.1分别接喇叭和PWM电机  P3.3接开关 P3.2接dac            P3.6和p3.7接正交编码器 .我想请教的是1.不知道这样接线会有问题吗,2接P1.2 P1.3 P1.4呼吸灯如何单独设置PWM.    3.如果检测电路没有接上拉电阻,是否能够检测到高低电平信号4.复合引脚如何设置

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:781
  • 最近打卡:2026-03-22 08:12:18

3

主题

104

回帖

2757

积分

金牌会员

积分
2757
发表于 2026-1-16 16:44:56 | 显示全部楼层
布置作业吗
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-1-16 16:53:46 | 显示全部楼层
先画个原理图贴出来,再讨论
截图202601161653436698.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:724
  • 最近打卡:2026-03-18 07:56:47
已绑定手机

97

主题

7244

回帖

1万

积分

超级版主

积分
13791
发表于 2026-1-16 18:03:34 | 显示全部楼层
PWM 2P和2N只能作为互补输出,不能单独输出,LED建议接到1P 2P 3P 4P中的3个上,编码器建议接PWM5和PWM6上
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-16 18:04:30 | 显示全部楼层
//呼吸灯PWM独立控制实现
//使用PWMB模块实现三路独立呼吸灯(参考增强型PWM技术4)// PWMB初始化(3个通道独立控制)
void PWMB_Init() {
    // 1. 解锁扩展寄存器
    P_SW2 |= 0x80;
   
    // 2. 配置PWM时基(周期=128系统时钟)
    PWMB_PS = 0;
    PWMB_PSCRH = 0;
    PWMB_PSCRL = 0;
    PWMB_ARRH = 0;
    PWMB_ARRL = 128;
   
    // 3. 通道映射到引脚
    PWMB_CCER1 = 0x00;
    PWMB_CCMR1 = (2 << 4);  // PWM2->P1.2
    PWMB_CCMR2 = (2 << 4);  // PWM3->P1.3
    PWMB_CCMR3 = (2 << 4);  // PWM4->P1.4
   
    // 4. 独立设置每路占空比(示例值)
    PWMB_CCR1H = 0; PWMB_CCR1L = 32;  // 灯1:25%
    PWMB_CCR2H = 0; PWMB_CCR2L = 64;  // 灯2:50%
    PWMB_CCR3H = 0; PWMB_CCR3L = 96;  // 灯3:75%
   
    // 5. 全局使能
    PWMB_ENO = 0x0E;  // 使能CH2/CH3/CH4输出
    PWMB_CR1 = 0x81;  // 使能PWM计数器
    P_SW2 &= ~0x80;   // 锁定寄存器
}

// 独立调整呼吸灯亮度
void Set_BreathLight(uint8_t ch, uint8_t duty) {
    ch &= 0x03; // 限制通道(0-2)
    uint8_t *ccrl = (uint8_t *)&PWMB_CCR1L + ch*2;
    *ccrl = duty;  // 直接写入CCRxL寄存器
}
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-16 18:06:02 | 显示全部楼层
// P1口模式配置寄存器设置
P1M0 = 0x1F;  // P1.0~P1.4设置为推挽输出(0001 1111)
P1M1 = 0xC0;  // P1.6~P1.7设置为高阻输入(1100 0000)
               // 其他引脚默认为准双向(P1.5未使用)

// 启用内部上拉电阻(对输入引脚)
P1PU |= 0xC0; // P1.6/P1.7使能上拉(1100 0000)
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-16 18:24:27 | 显示全部楼层
//1. ADC采集处理(P3.2)
#define SAMPLE_TIMES 5  // 采样次数

uint8_t Read_Input(uint8_t pin) {
    uint8_t count = 0;
    for(uint8_t i=0; i<SAMPLE_TIMES; i++) {
        if(P1 & (1<<pin)) count++;
        Delay_us(10);  // 10μs间隔
    }
    return (count > SAMPLE_TIMES/2) ? 1 : 0;
}


// 切换P1.0功能(PWM6/喇叭驱动)
void Set_P1_Function(uint8_t mode) {
    if(mode == PWM_MODE) {
        P_SW2 |= 0x80;           // 解锁扩展寄存器
        P1ASF |= (1 << 0);       // P1.0设为模拟功能
        PWMA_CCR6L = 80;         // 设置PWM占空比
        P1M0 |= (1 << 0);        // 保持推挽输出
        P_SW2 &= ~0x80;          // 锁定
        AUXR |= 0x04;            // 开启PWM6输出
    } else { // GPIO_MODE
        AUXR &= ~0x04;           // 关闭PWM输出
        P1ASF &= ~(1 << 0);      // 恢复数字功能
        P1M0 &= ~(1 << 0);       // 设置为准双向
        P1M1 &= ~(1 << 0);
        P1 &= ~(1 << 0);         // 输出低电平
    }
}



//2. 正交编码器解码(P3.6/P3.7)



// STC8系列ADC配置
void ADC_Init() {
    P3M0 &= ~(1 << 2);  // 清除模式位
    P3M1 |= (1 << 2);   // 设置P3.2为高阻输入
    ADDC = 0;           // 选择通道2
    ADCON = 0x80;       // 使能ADC,时钟分频
}

uint16_t Read_ADC() {
    ADC_RES = 0;        // 清空结果
    ADC_CONTR |= 0x40;  // 启动转换
    while(!(ADC_CONTR & 0x20)); // 等待完成
    ADC_CONTR &= ~0x20; // 清除标志
    return (ADC_RES << 2) | ADC_RESL; // 10位合并
}



//3. 开关检测(P3.3)


// 带消抖和状态识别
uint8_t Read_Switch() {
    static uint8_t state = 0xFF;
    static uint16_t counter = 0;
   
    uint8_t current = (P3 >> 3) & 0x01;  // 读取P3.3
   
    if (current != (state & 0x01)) {
        counter = 0;
    } else if (counter < 0xFFFF) {
        counter++;
    }
   
    if (counter > 1000) {  // 10ms消抖
        state = (state << 1) | current;
    }
   
    // 状态机检测边沿
    if ((state & 0x07) == 0x06) return 1; // 下降沿
    if ((state & 0x07) == 0x01) return 2; // 上升沿
    return 0;
}

// Timer Interrupt->>ADC: 每100μs启动转换
//    Timer Interrupt->>QEI: 周期检查中断标志
//    Main Loop->>Switch: 每20ms采样一次
//    ADC->>PID Controller: 提供反馈量
//    QEI->>Position Control: 更新位置
//    Switch->>System: 触发模式切换




//系统监控:

//看门狗定时器启用(WDT_CONTR = 0x35)

//ADC输入范围监测(超过90%量程触发警告)
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-17 15:43:26 | 显示全部楼层
哈哈仔细的好几十点啊                                                                                                                                                                                                                                                                                                               当使用第一组PWM定时器输出PWM波形时,可单独使能PWM1P/PWM2P/PWM3P/PWM4P输出,也可单独使能PWM1N/PWM2N/PWM3N/PWM4N输出。例如:若单独使能了PWMIP 输出,则PWMIN 就不能再独立输出,除非PWMIP 和PWMIN 组成一组互补对称输出。PWMA的4路输出是可分别独立设置的,例始:可单独使能PWMIP 和PWM2N输出,也可单独使能PWM2N和PWM3N输出。若需要使用第一组PWM定时器进行捕获功能或者测量脉宽时,输入信号只能从每路的正端输入,即只有PWM1P/PWM2P/PWM3P/PWM4P才有捕获功能和测量脉宽功能。       这是手册里面的原话,说  单独使能了PWMIP 输出,则PWMIN 就不能再独立输出。那我现在就这么接了,只可以换引脚吗?又说 PWMA的4路输出是可分别独立设置的 是否有前提必须配对呢,如果不配对就不让用还是可以独立干活??????????
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-17 15:45:08 | 显示全部楼层
Debu*** 发表于 2026-1-16 18:03
PWM 2P和2N只能作为互补输出,不能单独输出,LED建议接到1P 2P 3P 4P中的3个上,编码器建议接PWM5和PWM6上 ...

的确看晕了,谢谢啊 我去改引脚去了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-26 18:10:21
已绑定手机

3

主题

14

回帖

45

积分

新手上路

积分
45
发表于 2026-1-17 15:59:53 | 显示全部楼层
PWM 2P用了后,PWM 2n当普通IO口也不可以吗
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-23 23:09 , Processed in 0.124032 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表