pwm_dac.c
与PWM源文件程序相同,但是使用的是定时器11的通道1,所以要改变相应的定时器时钟,以及端口。在最后设置定时器输出比较初值为0,用按键对其进行修改。
#include "pwm_dac.h"
void TIM11_CH1_PWM_Init(u16 per,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义管教结构体变量
TIM_TimeBaseInitTypeDef TIMBaseInitStructure; //定时器参数结构体
TIM_OCInitTypeDef TIM_OCINitStructure; //pwm输出参数结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11,ENABLE); //使能定时器11时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能端口时钟,因为定时器11的pwm在通道1,是挂接在AHB的GPIOF9上的
GPIO_PinAFConfig(GPIOF,GPIO_PinSource7,GPIO_AF_TIM11); //将PF7映射到TIM4通道1的pwm功能上
//初始化PF9端口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//管脚设置F7
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化结构体
//初始化定时器参数
TIMBaseInitStructure.TIM_Period =per; //自动重装载值 周期
TIMBaseInitStructure.TIM_Prescaler = psc; //预分频系数(时钟源)
TIMBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割,时钟分频 通常不需要修改
TIMBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式选择向上计数
TIM_TimeBaseInit(TIM11,&TIMBaseInitStructure); //初始化定时器中断
//初始化PWM输出参数
TIM_OCINitStructure.TIM_OCMode = TIM_OCMode_PWM1; //比较输出模式:pwm模式
TIM_OCINitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性为高
TIM_OCINitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCINitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM11,&TIM_OCINitStructure);
TIM_OC1PreloadConfig(TIM11,TIM_OCPreload_Enable); //使能定时器14在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM11,ENABLE); // 使能定时器14ARR上的装载寄存器
TIM_SetCompare1(TIM11,0); //设置定时器11输出比较值初值为0
TIM_Cmd(TIM11,ENABLE); //开启定时器TIM11
}
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "pwm_dac.h"
#include "adc.h"
int main()
{
u8 i=0;
u8 key;
u16 pwm_value = 0;
u8 pwm_val;
float pwm_vol;
u16 adc_value;
float adc_vol;
SysTick_Init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(9600);
KEY_Init();
adcx_Init();
TIM11_CH1_PWM_Init(255,0); //APB2总线,最大时钟168M,168/256 = 656.25KHz
while(1)
{
key = KEY_Scan(0);
if(key == KEY_UP){
pwm_value +=10;
if(pwm_value >= 250){
pwm_value = 255;
}
TIM_SetCompare1(TIM11,pwm_value);
}
if(key == KEY_DOWN){
pwm_value -=10;
if(pwm_value < 10){
pwm_value = 0;
}
TIM_SetCompare1(TIM11,pwm_value);
}
i++;
if(i%20==0){
led1=!led1;
}
if(i%150 == 0){
pwm_val = TIM_GetCapture1(TIM11); //获取最后一次输出的PWM比较值
pwm_vol = (float)pwm_val*(3.3/256); //PWM为8位
printf("pwm 电压为%.3f\r\n",pwm_vol);
adc_value = Get_ADC_Value(ADC_Channel_5,20);//使用ADC1通道5采集输出PWM电压
adc_vol = (float)adc_value*(3.3/4096);//adc是12位所以除4096
printf("adc检测电压为%.3f\r\n",adc_vol);
}
myDelay_ms(10);
}
}