初级会员

- 积分
- 56
- 金钱
- 56
- 注册时间
- 2014-2-18
- 在线时间
- 4 小时
|
1金钱
设计目标:用的原子哥的精英板,自带12位DAC,通过定时器中断实现输出锯齿波,周期20ms(由0上升至最大值时间为13.5ms,由最大值下降到0的时间为4.5ms,保持0的时间为2ms,循环此过程),幅值为0~(2700/4095)*3.3= 0~2.176V。
设计方法与实验现象:希望产生的锯齿波尽量精准,就每次进中断计数器cnt自加1,DAC输出计数器也自加1,因此一次定时器中断时间为13.5ms/2700 = 5us。据此设置定时器。定时器中断中程序如下。- if(cnt < 2700)
- {
- num++;
- DAC_SetChannel1Data(DAC_Align_12b_R, num);
- }
- else if(cnt < 3599)
- {
- DAC_SetChannel1Data(DAC_Align_12b_R, num);
- }
- else if(cnt < 3999)
- {
- num = 0;
- DAC_SetChannel1Data(DAC_Align_12b_R, num);
- }
- else
- {
- cnt = 0;
- num = 0;
- }
复制代码
用示波器观察输出结果:波形和幅值与预期相符,但是周期不是20ms。
原因分析:考虑可能是实际定时器中断时间与设计时间不符。
解决方法与结果:于是在定时器中断中加入信号灯反转程序,观察定时器中断时间是否是设置的5us,结果发现定时器中断时间并不是5us。改成50us和500us后,输出波形与预期相符。
疑惑:在此请教一下定时器中断(我用的是定时器2,普通定时器)时间最小能设置成多少。
|
|