IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 炒冷饭系列-STM32F103之PWM_DAC -> 正文阅读

[嵌入式]炒冷饭系列-STM32F103之PWM_DAC

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "lsens.h"
#include "adc.h"
#include "dac.h"

void myPwmHandler(uint16_t prer,uint16_t value);
void pwmDacSet(u16 vol);
 int main(void)
{	
	
	 u16 pwmval=0;
	u16 adcx=0;
	 u8 t=0;
	 u8 key=0;
	 float temp=0;
	
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();
	LCD_Init();
	 
	myPwmHandler(0,255);//TIM1 PWM 初始化, Fpwm=72M/256=281.25Khz
	myAdcInit();
	TIM_SetCompare1(TIM1,0);//初始值为 0
	LCD_ShowString(60,150,200,16,16,"PWM VAL:");
	LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
	LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");
	while(1) 
	{	
		t++;	
		key=KEY_Scan(0);		
		if(key==WKUP_PRES)
		{
			if(pwmval<250)pwmval+=10;
			TIM_SetCompare1(TIM1,pwmval);
		}
		
		if(key==KEY1_PRES)
		{
			if(pwmval>10)pwmval-=10;
			else pwmval=0;
			TIM_SetCompare1(TIM1,pwmval);
		}
		
		if(t==10||key==KEY1_PRES||key==WKUP_PRES)
		{
			
			adcx=TIM_GetCapture1(TIM1);
			LCD_ShowxNum(124,150,adcx,4,16,0); //显示pwm寄存器值
			//DACx 输出电压=Vref*(DORx/4095)
			temp=(float)(adcx*(3.3/256));//DACx 输出电压
			adcx=temp;
			LCD_ShowxNum(124,170,temp,1,16,0); //显示电压值整数部分
			temp-=adcx;
			temp*=1000;
			LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分
			
			adcx=adcArc(ADC_Channel_1,20);//通道1,采样10次
//			LCD_ShowxNum(124,190,adcval,4,16,0);//寄存器的值只有12位,2^12=4096最大值为4位
//			
			temp=(float)adcx*(3.3/4096);//参考电压3.3V,被分成4096份  得到的adc_val 占多少份
			adcx=temp;//含有小数的强转化为整数
			LCD_ShowxNum(124,190,temp,1,16,0);//显示电压值 整数位
//			
			temp-=adcx;//得到小数部分
			temp*=1000;//得到3位整数,为了显示出来
			LCD_ShowxNum(140,190,temp,3,16,0X80);显示电压值 小数位
//			
//			LED0=~LED0;
			t=0;
//			delay_ms(250);
		}
		
	} 
}
 


//TIM1_CH1 的 PWM 输出(PA8),
void myPwmHandler(uint16_t prer,uint16_t value)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	//1、使能定时器时钟  GPIO口时钟因为没用到其输出或输入,只是借用一下而已
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//使能定时器 1 时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	
	//2、GPIOA8管脚配置和复用
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;//TIM1_CH1
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//3、TIM1参数配置
	TIM_TimeBaseInitStruct.TIM_Prescaler=prer;//给TIM时钟分频:范围0x0000~0xFFFF=0~65535,对应预分频寄存器:TIMx->PSC
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数模式:有5种,对应控制寄存器1:TIM_CR1_DIR位4 | TIM_CR1_CMS位[6:5]
	TIM_TimeBaseInitStruct.TIM_Period=value;//自动重装载值:0x0000 and 0xFFFF 对应自动重装载值寄存器:TIMx->ARR
	TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//APB1时钟36MHz  分频72MHz    给APB1时钟分频:1,2,4 ,对应控制寄存器1:TIM_CR1_CKD位[9:8]
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	
	//OC:Output Compare输出比较 OC2的2是通道2
	//TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;//通道PWM2
	//TIM_OCInitStruct.TIM_OCNIdleState=;
	//TIM_OCInitStruct.TIM_OCNPolarity=;
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;//输出级性
	//TIM_OCInitStruct.TIM_OutputNState=;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStruct.TIM_Pulse=0;
	TIM_OC1Init(TIM1, &TIM_OCInitStruct);
	
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能预装载寄存器
	
	TIM_ARRPreloadConfig(TIM1,ENABLE);//使能 TIMx 在 ARR 上的预装载寄存器
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE 主输出使能,高级定时器必须开启
	
	//5、使能定时器
	TIM_Cmd(TIM1,ENABLE);
}

//设置输出电压
//vol:0~330,代表 0~3.3V
void pwmDacSet(u16 vol)
{
	float temp=vol;
	temp/=100;
	temp=((temp*256)/3.3);
	TIM_SetCompare1(TIM1,temp);
}




  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:37:07  更:2021-10-12 23:38:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:51:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码