打印
[技术问答]

N76E003的PWM LOAD问题

[复制链接]
1031|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
N76E003的PWM是一个计数器和一个专门寄存器(举例叫“N")比较输出的,而且还有一个专门的寄存器(举例叫“M”)用来保存我们写入的数据,当一个计数周期结束后,会把M的数据LOAD到N中,然后重新开始计数比较输出PWM信号。在把M读取到N内的过程中,LOAD标志位读取到的是1(正在执行载入动作),当数据载入完成后,再读取LOAD标志位就是0了。这个没有问题。
现在我的问题是:我要把音频数据读出然后从PWM脚输出,我现在PWM的输出周期是62.5us,我的中断是20us(用的定时器0的模式2),然后我就在中断里面去写读取FLASH中的音频数据然后输出。我在中断中的程序是:
if(!LOAD){
    PWM3L = AudioDataBuf;        
    set_LOAD;        //载入周期和占空比       
       

    //读取FLASH数据程序
    //.........
    //最后读取的数据放到AudioDataBuf变量中
}
意思就是当没有执行LOAD的时候,把AudioDataBuf中的数据放到PWM3L的BUF中(只用低8bit,所以PWM3H一直是0),然后下面读取FLASH的数据,但是我测试了读取数据就花10多us时间,等下次再次进入20us中断的时候,我检测到LOAD还是没有动作(因为前一次的数据输出要62.5us,我一次中断才20us,还远远没有到PWM需要重新加载的时候),那么会重新把前面读到的AudioDataBuf再次放到PWM3L中,感觉会冲掉很多数据,如果我PWM的周期是62.5us,我中断是20us,感觉读取3个数据才有一个是有效的,其他都被覆盖掉了。
我想问一下,有什么标志位,或者方法,可以让我知道前一次的PWM还没有完成LOAD工作。

上图中62.5us就是PWM的周期,12us是中断中读取音频数据的执行时间,20us是中断间隔时间。感觉数据1和数据2都会被舍弃,只有数据3读取出来了正好碰上PWM刷新,需要重新LOAD数据。
我不知道要如何处理这个问题,请高人指点一二。

使用特权

评论回复
沙发
kevinleez|  楼主 | 2019-7-30 14:57 | 只看该作者
难道要设置PWM的中断,设置PWM中断类型为每个PWM周期的终点,这个中断中设置一个变量来表示一个PWM周期已经结束?这样可以吗?

使用特权

评论回复
板凳
huangcunxiake| | 2019-7-30 22:47 | 只看该作者
试试中断如何。

使用特权

评论回复
地板
jiekou001| | 2019-7-30 23:14 | 只看该作者
没这方面经验。

使用特权

评论回复
5
jasontu| | 2019-7-31 08:38 | 只看该作者
你的pwm頻率可以設500k
timer中斷最快進入時間就要4us.應該不用等load flag, 直接放到pwml, 直接重載 set_LOAD;  
每次中斷就直接更新pwm


使用特权

评论回复
6
tianxj01| | 2019-7-31 10:35 | 只看该作者
你这个数据高速更新的过程,本身就应该在PWM中断而不是在另外一个非同步中断,而且,如果为了保证PWM输出的准确性,你该设置该中断优先级为最高,这可以确保每次PWM中断,有新的数据可以更新到PWM寄存器。16KHz的中断频率,只是读取一个八位寄存器,再写入,完全没有问题。
中断程序必须优化,不能用if  while什么的判断,可以用数组加索引或者指针模式,目标buf只通过指针++等什么来改变,这样的执行效率是最高的。

使用特权

评论回复
7
monitoring| | 2019-7-31 15:06 | 只看该作者
没用过,一起学习下

使用特权

评论回复
8
小明的同学| | 2019-7-31 15:37 | 只看该作者
上面的高手真厉害。

使用特权

评论回复
9
玛尼玛尼哄| | 2019-9-19 23:51 | 只看该作者
意思是要完成当前的周期,才能去加载新的配置

使用特权

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

本版积分规则

46

主题

137

帖子

2

粉丝