📄 dac.c
字号:
#include "2410addr.h"
#include "def.h"
#define KEY1 (1 << 3) //GPG3
void PWM_Init(U16 cycle, U16 duty){
if (duty > cycle) duty = cycle; // 参数过滤
rTCFG0 = rTCFG0 & ~(0xff << 8) | (99 << 8);//rTCFG0[15:8]=99,预分频器0设置为100,取得507000Hz
rTCFG1 = rTCFG1 & ~(0xf << 8); //rTCFG1[11:8]=0,timer2再取1/2分频,取得253500Hz
rTCMPB2 = duty; // 设置PWM占空比
rTCNTB2 = cycle; // 定时值(PWM周期)
rTCON = (rTCON & ~(0xf << 12)) | (0xa<<12); //Auto reload, Inverter off, Manual update, Stop, Dead zone disable
rTCON = (rTCON & ~(0xf << 12)) | (0x9<<12); //Auto reload, Inverter off, No operation, Start, Dead zone disable
}
void Main(void){
U16 pwm_dac = 0, nLED = 0; //初始化占空比为0,即输出0V电压
rGPFDAT = (rGPFDAT & 0x0f) | ((~nLED & 0xf)<<4);
rGPFCON = (rGPFCON & 0x00ff) | 0x5500;//设置GPF[7:4](LED[4:1])为输出功能
rGPGCON &= ~(3 << 6); //rGPGCON[7:6]=0,KEY1控制口设置
rGPBCON = (rGPBCON & (~(3<<4))) | (2<<4); //rGPBCON[5:4] = 10b,设置TOUT2功能
rGPBUP |= (1<<2); //禁止TOUT0口的上拉电阻
// 初始化PWM输出。设PWM周期控制值为255 (即DAC分辨率为8位)
PWM_Init(255, pwm_dac);
Delay(0);
// 等待按键KEY1,改变占空比
while(1)
{
if (!(rGPGDAT & KEY1)){//当KEY1被按下
Delay(100);
if (rGPGDAT & KEY1) continue;
pwm_dac = pwm_dac + 16; // 改变D/A输出的电压值
nLED += 1;
if (pwm_dac > 255){
pwm_dac = 0;
nLED = 0;
}
rTCMPB2 = pwm_dac; //占空比
rGPFDAT = (rGPFDAT & 0x0f) | ((~nLED & 0xf)<<4);
while (!(rGPGDAT & KEY1));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -