打印
[KungFu32位 MCU]

高级定时器触发ADC

[复制链接]
9079|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taozhi11|  楼主 | 2021-7-9 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟想用高级定时器T5在做ECCP5六路PWM输出的同时去作为ADC的触发,但是一直触发不了。
查看了使用手册(1011=比较模式:触发特殊事件(CC4IF位置1,ECCPx复位Tz,如果ADC使能将启动AD转换)
发现只有在比较模式下才能触发特殊事件,,这如何将一个ECCP在发送PWM的同时又用来触发ADC呢?

使用特权

评论回复
沙发
taozhi11|  楼主 | 2021-7-9 15:05 | 只看该作者
更新,在更详细阅读用户手册后,发现有另一种触发方式
以高级定时器 Tx 触发 AD 为例,当使用 Tx,可以使用自动触发 AD 的功能。AD 触发
功能有两种形式,一种是通过 Tx 溢出信号触发,一种是通过 Tx_CCRy(x=5;y=0,1)寄存
器与 Tx 匹配时产生触发,这种方法可在周期中的任意位置触发 AD。
以 Tx 触发 AD 为例,设置寄存器 Tx_CTL,选择合适的计数模式,通过 TXOFS<1:0>
选择 Tx 的上溢/下溢触发 AD,通过 TXADAUTO 使能 Tx 溢出触发 AD。TXADAUTO 信号
在完成一次 AD 转换后自动清零。
还可以设置 Tx_CCRy(y=0,1)寄存器,当 Tx_CCRy 与 Tx 匹配时,也会产生 AD 触发
信号,将 ADSTART 位置 1
翻阅库函数发现这条语句
/**
  * 描述  配置Tx溢出中断自动触发AD控制位。
  * 输入  ATIMx: 指向定时器内存结构的指针,取值T5_SFR/T9_SFR。
  *       NewState: Tx溢出中断自动触发AD控制位,
  *                 取值为:TRUE或FALSE。
  * 返回  无
  */
void
ATIM_X_TriggerAD_Config (ATIM_SFRmap* ATIMx, FunctionalState NewState)
{
    /* 参数校验 */
    CHECK_RESTRICTION(CHECK_ATIM_PERIPH(ATIMx));
    CHECK_RESTRICTION(CHECK_FUNCTIONAL_STATE(NewState));

    /*-------------------- 设置TXCTL寄存器TXADAUTO位 --------------------*/
    if (NewState != FALSE)
    {
        /* 计数模式 */
        SFR_SET_BIT_ASM(ATIMx->TXCTL, ATIM_TXCTL_TXADAUTO_POS);
    }
    else
    {
        /* 定时模式 */
        SFR_CLR_BIT_ASM(ATIMx->TXCTL, ATIM_TXCTL_TXADAUTO_POS);
    }
}

可以通过TXADAUTO来使能Tx溢出触发AD,于是我将本人代码更改如下
void cfg_T5(void)
{
        ATIM_X_Work_Mode_Config(T5_SFR,ATIM_TIMER_MODE);                                //定时模式
        ATIM_X_Set_Counter(T5_SFR,0);                                                                        //T5计数值清0
        ATIM_X_Set_Period(T5_SFR,ECCP5_PWM_PERIOD);                                                                //周期值
        ATIM_X_Set_Prescaler(T5_SFR,0);                                                                        //预分频器 1:1
        ATIM_X_Postscaler_Config(T5_SFR,ATIM_POSTSCALER_DIV_1);                        //后分频比为1:1
        ATIM_X_Counter_Mode_Config(T5_SFR,ATIM_COUNT_UP_DOWN_OF);                        //中心对齐的PWM信号,向上计数,上溢时产生中断标志
        ATIM_X_Clock_Config(T5_SFR,ATIM_SCLK);                                                        //选用SCLK时钟为Tx工作时钟
        ATIM_X_Updata_Immediately_Config(T5_SFR,FALSE);                                        //立即更新以 T5 为时基的占空比、周期、预分频、更新计数器寄存器,并将定时器清零

        ATIM_X_Updata_Output_Ctl(T5_SFR,FALSE);                                                        //立即更新以T5为时基的输出控制寄存器
        ATIM_X_Updata_Enable(T5_SFR,TRUE);                                                                //允许以T5为时基的相关配置信息更改
        ATIM_X_Set_TriggerAD_Signal(T5_SFR,0,0);

        ATIM_X_Overflow_AD_Enable(T5_SFR,TRUE);
        //ATIM_X_Underflow_AD_Enable(T5_SFR,TRUE);
        ATIM_X_TriggerAD_Config(T5_SFR,TRUE);
        ATIM_X_Cmd(T5_SFR,TRUE);                                                                                //T5启动控制使能
}

却仍没有实现AD的触发
哪里做错了呢?求帮助

使用特权

评论回复
板凳
taozhi11|  楼主 | 2021-7-9 16:44 | 只看该作者
最新战况
TXADAUTO:Tx 溢出中断自动触发 AD 控制位,当 AD 转换结束后自动清零
0 = 禁止 Tx 溢出中断自动触发 AD
1 = 使能 Tx 溢出中断自动触发 AD
当将TXADAUTO置1后,ATIM_X_Cmd(T5_SFR,TRUE);//Tx启动控制使能
到这里TXADAUTO这一位的值仍是1,但是后面再进行ADC_Cmd (ADC0_SFR, TRUE); //ADC使能
后,TXADAUTO莫名其妙被置0。

使用特权

评论回复
地板
taozhi11|  楼主 | 2021-7-9 16:46 | 只看该作者
有的朋友可能会问,那先初始化AC再初始化定时器不就完了,事实上如果进行这样操作,在运行完
ATIM_X_TriggerAD_Config(T5_SFR,TRUE);//配置Tx溢出中断自动触发AD控制
后TXADAUTO置1成功,但再运行完ATIM_X_Cmd(T5_SFR,TRUE);//Tx启动控制使能这条语句后
问题出现了!!!!!!!!!!
TXADAUTO又被置0了,这是为啥啊?????????????

使用特权

评论回复
5
taozhi11|  楼主 | 2021-7-11 18:22 | 只看该作者
已经解决问题,TXADAUTO 这个寄存器会在完成一次AD转化后自动清零,解决方案为在ADC中断里重新为这个寄存器赋值。之前因为偷懒用LED的亮灭来判断中断的发生,但是频率设置过快导致不能产生正常的亮灭而是体现为灯的亮度。所以错过了这个解决方案

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝