新手必看!!附源码!!STM32通用定时器-比较输出PWM

一、什么是PWM?

PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。

二、PWM的原理

PWM的基本原理是通过以一定频率产生的脉冲信号,通过调整脉冲的宽度(占空比)来模拟电压的不同电平。占空比是指脉冲高电平的时间占整个周期的比例。通过调整占空比,可以在输出端产生不同的电平,从而实现对电机、LED等设备的精确控制。

例如,对于一个50%占空比的PWM信号,脉冲的高电平时间占整个周期的一半,这将导致输出电平的平均值为一半的电压。通过调整占空比,你可以在0%到100%的范围内控制输出电平的变化。

三、PWM模式以及输出PWM原理

ARR: 自动重装载寄存器的值。
CCRx: 捕获/比较寄存器的值。

PWM波周期或频率由ARR决定,PWM波占空比由CCRx决定

(1)PWM模式1
在向上计数时,一旦CNT<CCRx 时输出为有效电平,否则为无效电平。
在向下计数时,一旦CNT>CCRx 时输出为无效电平,否则为有效电平。

如:
在这里插入图片描述
当CNT < CCRx,IO输出1。
当CNT >= CCRx,IO输出0。

在这里插入图片描述
当CNT <=CCRx,IO输出1。
当CNT > CCRx,IO输出0。

(2)PWM模式2
在向上计数时,一旦CNT>CCRx 时输出为有效电平,否则为无效电平。
在向下计数时,一旦CNT<CCRx 时输出为无效电平,否则为有效电平。
如:
在这里插入图片描述当CNT < CCRx,IO输出0。
当CNT >= CCRx,IO输出1。
在这里插入图片描述
当CNT <= CCRx,IO输出0。
当CNT > CCRx,IO输出1。

四、PWM极性设置

当极性为高 (TIM_OCPolarity_High) 时,不进行反相。即按pwm模式正常的去进行比较与输出。
当极性为低 (TIM_OCPolarity_Low) 时,输出通道在比较匹配时为低电平,相当于对输出信号进行反相。

如:pwm模式1向上计数。
设置高极性:当CNT < CCRx,IO输出1。 当CNT >= CCRx,IO输出0。
设置低极性:当CNT < CCRx,IO输出0。 当CNT >= CCRx,IO输出1。

四、配置PWM输出实验步骤

实验内容:将PC6复用为TIM3通道1,用于输出pwm。注:stm32的pwm输出引脚是使用的IO口的复用功能。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(1)具体代码1–寄存器:

    void PWM_Init_TIM3_CH1(u16 ccr)
{//1.初始化PC6引脚RCC->AHB1ENR |=(0x01 <<2); //开启GPIOC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO时钟AFIO->MAPR |=(0x03 <<10); //定时器3 完全重映射GPIOC->CRL &= 0XF0FFFFFF;//PC6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)//2.初始化基本定时器配置RCC->APB1ENR |= 1 << 1;      //使能TIM3时钟 TIM3->SMCR &=~(0x07 << 0);   //选择内部时钟源TIM3->CR1 &=~(0x03<<5);  //边沿对齐TIM3->CR1 &=~(0X01<<4); //设置为向上计数模式TIM3->CR1 |=(0x01 <<7);   //有影子,缓冲。TIM3->ARR = 99;//设定计数器主动重装值(决定PWM的频率)TIM3->PSC = 7199;//预分频器 0为不分频  //3.初始化输出通道TIM3->CCR1 =ccr;   //写入比较值TIM3->CCMR1 &=~(0x03 << 0) ;    //通道配置为输出功能TIM3->CCMR1 |=(0x01 << 3);    //有影子TIM3->CCMR1 &=~(0x01 <<7);    //OC1Ref不受ETRF输入影响。TIM3->CCMR1 &= ~0x07 <<4; TIM3->CCMR1 |=(0x06 <<4); //PWM模式1TIM3->CCER &=~(0x01 <<1); //实际波形=参考波形。 不反相TIM3->CCER  |= (0x01 << 0);//输入/捕获1输出使能TIM3->EGR |=(0x01 <<0); //产生更新事件,将上面配置更新到影子寄存器TIM3->CR1 |= (0X01 << 0);//使能定时器3    
}

主函数:

int main()
{//pwm范围为0-ARR。 高低电平随着pwm模式不同而不同。//如比较值为90,pwm模式1向上计数,低于比较值90时,为高电平。PWM_Init_TIM3_CH1(90);  while(1){}}

(2)具体代码2–库函数

void TIM3_PWM_Init(u16 arr,u16 psc)
{      GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  qjl;//初始化定时器TIM_OCInitTypeDef TIM_OCInitsture;//设置定时器的pwm模式RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	GPIO_Init(GPIOC, &GPIO_InitStructure);     GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);qjl.TIM_Period = arr;    //设置自动重装载寄存器周期的值   ARR qjl.TIM_Prescaler =psc;  //设置时钟频率除数的预分频值  qjl.TIM_ClockDivision =TIM_CKD_DIV1;  qjl.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseInit(TIM3,&qjl);TIM_OCInitsture.TIM_OCMode=TIM_OCMode_PWM2;TIM_OCInitsture.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitsture.TIM_OutputState=TIM_OutputState_Enable;TIM_OC1Init(TIM3,&TIM_OCInitsture);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OC2Init(TIM3,&TIM_OCInitsture);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);	TIM_Cmd(TIM3,ENABLE);		
}

主函数:

u16 dir=1;
u16 ledpwm=100;
int main(void)
{led_int();delay_init(); //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设 置 NVIC 中 断 分 组 2TIM3_PWM_Init(899,0);uart1_init(115200);while(1){	 delay_ms(2);if(dir){ledpwm++;}else{		 ledpwm--;}if(ledpwm>900)dir=0;if(ledpwm==0)dir=1; TIM_SetCompare1(TIM3,ledpwm);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211500.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter压测常见面试问题

1、JMeter可以模拟哪些类型的负载&#xff1f; JMeter可以模拟各种类型的负载&#xff0c;包括但不限于Web应用程序、API、数据库、FTP、SMTP、JMS、SOAP / RESTful Web服务等。这使得JMeter成为一个功能强大且灵活的压力测试工具。 2、如何配置JMeter来进行分布式压力测试&a…

开源 GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台)

GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台) 讨论群v:&#x1f680;18601938676 一、AI人工智能开发-------------面临的问题和挑战 1. GPU管理难题 1.1 资源管理难&#xff1a;算力资源昂贵&#xff0c;但是缺乏有效管理&#xff0c;闲置情况严重。 1.2 用户…

线程提交线程到线程池,有几种方式,哪一种方式是工作中不能使用的,无法捕捉异常,线程池的拒绝策略,线程池的提交方式

线程池的工作原理 JDK中提交线程到线程池&#xff0c;有几种方式&#xff0c;哪一种方式是工作中不能使用的&#xff0c;无法捕捉异常 两种提交任务的方法 ExecutorService 提供了两种提交任务的方法&#xff1a; execute()&#xff1a;提交不需要返回值的任务 submit()&a…

机器学习实战-第5章 Logistic回归

Logistic 回归 概述 Logistic 回归 或者叫逻辑回归 虽然名字有回归,但是它是用来做分类的。其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式,以此进行分类。 须知概念 Sigmoid 函数 回归 概念 假设现在有一些数据点,我们用一条直线对这些点进行…

TCP /UDP协议的 socket 调用的过程

在传输层有两个主流的协议 TCP 和 UDP&#xff0c;socket 程序设计也是主要操作这两个协议。这两个协议的区别是什么呢&#xff1f;通常的答案是下面这样的。 TCP 是面向连接的&#xff0c;UDP 是面向无连接的。TCP 提供可靠交付&#xff0c;无差错、不丢失、不重复、并且按序…

linux centos上安装python3.11.x详细完整教程

一. 安装步骤 注意&#xff1a; 1、安装python3.11的其他版本替换下面的版本信息即可。(如想安装3.11.5将案例中的3.11.0替换成3.11.5即可) #下载最新的软件安装包 wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#解压缩安装包 tar -xzf Python-3.11.0.tg…

暗物质探测器认知教学VR元宇宙平台打破传统束缚

“飞船正在上升&#xff0c;马上就冲出大气层了!”这是一位在1&#xff1a;1还原的神舟飞船返回舱内借助VR设备置身元宇宙世界&#xff0c;沉浸式体验升空全过程的游客兴奋地说道。不仅如此&#xff0c;在载人飞船训练期&#xff0c;元宇宙技术为航天员虚拟一个逼真的太空世界&…

数据中台建设方法论

1、数仓的概念和了解--业务的痛点 产生的痛点&#xff1a;数据资产比较模糊、数据的质量比较低、重复建设、代码的耦合性比较强。 2、数据仓库中的常见的模型&#xff1a; 1、心型模型&#xff1a;中间是一张事实表&#xff0c;周围都是维度表。 对于心型模型的主要的特点&a…

DDD落地:从网易新闻APP重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

电子学会C/C++编程等级考试2023年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536输入 输入只有一行, 包含一个字符。输出 该字符构成的长方形,长4个字符,宽3个字符。样例输入…

SPSS多元对应分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

EI论文故障识别程序:DBN深度置信/信念网络的故障识别Matlab程序,数据由Excel导入,直接运行!

​适用平台&#xff1a;Matlab2021b版及以上 本程序参考中文EI期刊《基于变分模态分解和改进灰狼算法优化深度置信网络的自动转换开关故障识别》中的深度置信网络&#xff08;Deep Belief Network&#xff0c;DBN&#xff09;部分进行故障识别&#xff0c;程序注释清晰&#x…