STM32——pwm.dac

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);
	}
}

		 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值