找回密码
 立即注册
查看: 139|回复: 2

pwm输出应用问题,请求帮助

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-26 12:39:25
已绑定手机

1

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2025-5-26 12:39:25 | 显示全部楼层 |阅读模式
用到的芯片是:AI8H2K08U
系统:win7旗舰版  64位
工具软件:Keil uVision5
要实现的功能:
利用PWMA的第一与第3输出通道正极驱动外设。
默认输出管脚设置:pwma1p:P1.0;pwma3p:P1.4
其中,pwma3p:P1.4引脚也定义为T11计数器的外部输入引脚。

程序如下:

#include "ai8h.h"
#include "intrins.h"

#define uint unsigned int
#define uchar unsigned char
        
uchar zhch;
uint  zhch_H=800,zhch_L=500;        //

void tm11isr() interrupt 67   //T11中断程序
{
        if(zhch)
        {
                PWMA_CCR1 = zhch_L;                //设置占空比时间
                PWMA_CCR3 = zhch_L;
                zhch=0;
        }
        else
        {
                PWMA_CCR1 = zhch_H;                //设置占空比时间
                PWMA_CCR3 = zhch_H;
                zhch=1;
        }
}

void main()
{
        P_SW2 |= 0x80;        //使能访问XFR,没有冲突不用关闭
        P0M0 = 0x00;               
        P0M1 = 0x00;               
        P1M0 = 0x00;               
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
               
        //PWMA_PS=0x00;  //设置PWM通道输出脚位定义,默认0,管脚注释名
        
        //高级PWMA1P通道:
        PWMA_CCER1 = 0x0;        //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
        PWMA_CCMR1 = 0x60;        //设置CC1为PWMA1输出模式
        PWMA_CCER1 = 0x01;        //使能CC1通道
        PWMA_CCR1 = 500;        //设置占空比时间
        PWMA_ARR = 1500;        //设置周期时间

        //高级PWMA3P通道:
        PWMA_CCER2 = 0x0;        //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
        PWMA_CCMR3 = 0x60;        //设置CC3为PWMA1输出模式
        PWMA_CCER2 = 0x01;        //使能CC3通道  
        PWMA_CCR3 = 500;        //设置占空比时间(PWMA_ARR:周期相同)
        
        PWMA_ENO = 0x11;        //使能1、3的正极性输出。3的输出,作为T11的外部计数输入
        PWMA_BKR = 0x80;        //使能主输出
        PWMA_CR1 = 0x01;         //开始计时
        
        /*定时器T11的初始化*/
        T11H=0xff; T11L=100;   //自动重载计数初值。预分频寄存器T11PS默认0:不分频
        T11CR=0xc2;        //0B1100,0010:使能、计数、禁止输出、分频、2位时钟源、可中断、中断标志

        while (1);
}

问题:
1:用“拓展Keil的C代码中断号”,支持了T11的中断号67,编译通过,但软件调试时,不能进入T11中断程序,不知哪里设置出了问题。第一次使用高级pwm功能。
2:软件调试时,可以观察自定义变量的数值,但不能观察很多片内寄存器数值,例如:观察PWMA_CCER1、PWMA_ENO等数值时,显示<cannot evaluate>,灰色。

   可以查看P0M1的数值,显示为0x00,uchar类型。是否开发环境没有设置好,或缺少什么支持文件。
谢谢各位大佬指正!
截图202505261239074960.jpg
回复

使用道具 举报 送花

3

主题

698

回帖

107

积分

等待验证会员

积分
107
发表于 2025-5-26 12:43:00 | 显示全部楼层
  1. c
  2. // 在中断程序中,确保外部引脚的状态正确初始化
  3. void tm11isr() interrupt 67 {
  4.     // 确保外部引脚的状态正确初始化
  5.     P14 = 0x00; // T11引脚的外部引脚初始化为0x00
  6.     P11 = 0x00; // T12引脚的外部引脚初始化为0x00
  7. }
复制代码

说明:
1. 外部引脚的状态初始化:在中断程序中,外部引脚的状态需要正确初始化,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
2. 使用0x00初始化:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。

注意事项:
外部引脚的状态初始化:在中断程序中,外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
使用0x00:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。

通过上述修改,中断程序能够正确检测P14引脚的状态变化,从而正确切换到执行代码。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-06-17 17:14:03
已绑定手机
已实名认证

112

主题

2394

回帖

6026

积分

版主

积分
6026
发表于 2025-5-27 10:19:17 | 显示全部楼层
不能进入T11中断,可以查看有关T11中断,还有EA是否使能,如果都设置完好的话,是可以仿真跳转进入中断程序的,我看你的总中断EA=1这一句就没有
第二个问题,寄存器需要通过类似char a; a = PWMA_ENO;这样子,然后仿真查看a变量来观察
因为内部寄存器有部分没有关联/被占用做其他映射用途,所以要用普通的变量中转一下再查看
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 23:26 , Processed in 0.134025 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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