本篇文章读者需提前掌握PWM、掌握定时器、掌握DAC
PWM DAC简介
- PWM DAC功能是使用定时器的PWM功能通过硬件电路二阶RC滤波达到与DAC一样的效果。
- PWM DAC功能实际上只用了定时器PWM功能,没有使用DAC功能。
- 二者都可以输出0-3.3V之间任意电压。
- PWM DAC需要配合硬件电路二阶RC滤波
PWM输出的是方波,PWM DAC实际上输出的电压值为方波的有效值,方波的有效电压为高电平部分与整个周期的比值。若占空比100%则PWM的实际有效值是3.3v,若占空比50%则PWM的实际有效值是3.3/2v,若占空比为0%则PWM的实际有效值是0v。如图所示:
所以PWM DAC输出的电压值等于方波的有效值,有效值又通过占空比控制的,占空比由CCR寄存器控制,即PWM DAC输出电压大小与CCR的值成正相关。
程序
配置PWM,与普通的PWM实验一样
int main(void)
{
u16 adcx;
float temp;
u8 t=0;
u16 pwmval=0;
u8 key;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
Adc_Init(); //adc初始化
KEY_Init(); //按键初始化
TIM9_CH2_PWM_Init(255,0);
TIM_SetCompare2(TIM9,pwmval); //初始值
while(1)
{
t++;
key=KEY_Scan(0);
if(key==4)
{
if(pwmval<250)pwmval+=10;
TIM_SetCompare2(TIM9,pwmval);
}else if(key==2)
{
if(pwmval>10)pwmval-=10;
else pwmval=0;
TIM_SetCompare2(TIM9,pwmval);
}
if(t==10||key==2||key==4)
{
adcx=TIM_GetCapture2(TIM9);;
printf("PWM DAC:%d\t",adcx);
temp=(float)adcx*(3.3/256);;
printf("PWM DAC_V:%.2f\t",temp);
adcx=Get_Adc_Average(ADC_Channel_5,20);
temp=(float)adcx*(3.3/4096);
printf("ADC_V:%.2f\r\n",temp);
t=0;
LED0=!LED0;
}
delay_ms(10);
}
}