基于stm32单片机的可调节pwm输出

发布者:数字冒险最新更新时间:2018-06-29 来源: eefocus关键字:stm32  单片机  可调节pwm输出 手机看文章 扫描二维码
随时随地手机看文章

目标:


1.通过按键1切换pwm频率的切换。


2.通过按键2实现pwm占空比的切换。


3.备注:不附加硬件原理图,但是通过描述简单介绍引脚的连接。


硬件原理描述:


1.通过3个IO口实现16个按键的检测。

2.按键1,按键2不多做描述,通过键盘扫描程序循环检测按键

3.通过TIM2 CHI通道PA0输出波形。


pwm输出配置功能函数:


#include "pwm.h"

static  u16 Tim_Prescaler=35;       //配置TIM默认时钟分频

static  u16 TIMCompare1=200;        //配置TIM默认脉冲比较值

void GPIO_cfg() //配置pwm输出相关引脚  

{  

    GPIO_InitTypeDef GPIO_InitStructure;  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA的时钟 

    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //复用时钟不需要失能

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //选择引脚0                                                           

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //输出频率最大50MHz                                                 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出   

    GPIO_Init(GPIOA,&GPIO_InitStructure);   

void TIMER_cfg(void)//配置TIM2   

{  

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //开启TIM2的时钟   

    //设置预分频系数  

    TIM_TimeBaseStructure.TIM_Prescaler =Tim_Prescaler;  

    //设置计数自动重装值大小  

    TIM_TimeBaseStructure.TIM_Period = 1000;    

    //设置计数器模式为向上 

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    

    //设置时钟分割---不分割  

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

    //将配置应用到TIM2中  

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

void PWM_cfg(void)//配置pwm输出   

{  

    TIM_OCInitTypeDef TimOCInitStructure;  

    //TIM_OCStructInit(&TimOCInitStructure);  

    //PWM模式1输出 

    TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  

    //设置占空比0.2 

    TimOCInitStructure.TIM_Pulse = 200;  

    //TIM输出比较极性高  

    TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  

    //使能输出状态  

    TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  

    //TIM2的CH1输出  

    TIM_OC1Init(TIM2, & TimOCInitStructure);  

    //设置TIM2的PWM输出为使能  

    //TIM_CtrlPWMOutputs(TIM2,ENABLE); //高级定时器专用,TIM2不需要此函数功能



    //使能或者失能TIM2在CCR1上的预装载寄存器 使能:在更新事件发生时才会传送预装载值(从CCR1到影子寄存器);失能:直接传送预装载值

    //TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    //使能或者失能 TIMx 自动重装载寄存器· 

    //TIM_ARRPreloadConfig(TIM2, ENABLE);

}

//pwm输出初始化,默认输出方波频率=2Khz,占空比=0.2 

void PWM_Init(void) 

{

    GPIO_cfg();

    TIMER_cfg();

    PWM_cfg();

    TIM_Cmd(TIM2,ENABLE);

}

void PWM_changefre(void)  //频率转换:2Khz  200hz

{

    if(Tim_Prescaler==359)

    {

        Tim_Prescaler=35;

    }

    else

    {

        Tim_Prescaler=359;

    }

    TIM_PrescalerConfig(TIM2, Tim_Prescaler,TIM_PSCReloadMode_Update);//设置 TIM2 预分频,即时或者下次更新作用

}

//更改占空比,默认0.2,0.4,0.6,0.8,0.2依次循环

void PWM_changeduty(void) 

{

    if(TIMCompare1<800)

    {

        TIMCompare1+=200;

    }

    else

        TIMCompare1=200;

    TIM_SetCompare1(TIM2, TIMCompare1);//设置 TIMx 捕获比较 1 寄存器值

}



主函数:


#include "public.h"

static u8 key=0x10;

int main(void)

{

    SystemInit();               //init system rcc  HSE 72Mhz

    power_init();               //open power sourse

    delay_init(72);             //system clock frequency 72Mhz

    KEY_Init();

    PWM_Init();

    while(1)

    {

        key=KEY_Scan();

        if(key==0)              //修改定时器预分频值,完成pwm频率切换。200HZ--------2KHZ

        {

            key=0xff;

            delay_ms(100);      

            PWM_changefre();

        }

        if(key==2)              //修改占空比

        {

            key=0xff;

            delay_ms(100);

            PWM_changeduty();

        }

    }

}


总结:


1.配置pwm输出的一般性步骤:


1.配置pwm输出相应的GPIO口。

2.配置pwm输出相应的定时器。

3.配置pwm输出相应的输出通道。

2.几个要点的理解:


1.涉及到IO口重映射问题

2.AFIO时钟问题

对寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 进行读写操作前,应当首先打开 AFIO 的时钟。

上句话是从stm32中文参考手册找到的。

也就是说配置AFIO的事件控制寄存器(AFIO_EVCR)、复用重映射和调试I/O 配置寄存器(AFIO_MAPR)、外部中断配置寄存器 1(AFIO_EXTICR1)等才需要启用AFIO时钟。

并不是说引脚复用时就必须开启AFIO时钟。所以,在上述程序中,不需要开启AFIO 时钟(已经验证OK)。

3.计数器(TIMx_CNT)

这个寄存器是用来计数的,数数用的

4.自动重装载寄存器  和(影子寄存器)--->实际的自动重装载寄存器

a.自动重装载寄存器存储的是TIM计数值的大小,计数器到了这个值就会发生溢出停止计数,但并是用该寄存器直接和计数器比较。

b.真正用来和计数器比较的是影子寄存器(物理存在的),自动重装载寄存器的值送到了这里。

c.这两个寄存器是联通的。

d.什么时候把自动重装载寄存器值送到影子寄存器?

先来看一下下面这个函数:它的作用是使能或者失能 TIMx 在 ARR 上的预装载寄存器(自动重装载寄存器)。

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState Newstate)

失能=0:TIMx_ARR寄存器没有缓冲;

使能=1:TIMx_ARR寄存器被装入缓冲器。

答案:通过配置TIMx_CR1的ARPE位,决定什么时候把自动重装载寄存器值送到影子寄存器。

5.捕获/ 比较寄存器(输出模式下)

该寄存器的值决定pwm输出时的占空比。计数器会根据这个值的大小来判断何时翻转电平。比如:计数值100,,比较值50,则占空比就为50%

同样的,该寄存器也有相应的影子寄存器。功能同上。

6.转换频率:

首先要理解定时器是怎么完成频率输出:

a.系统频率设置为72Mhz          设为X频率

b.初始化定时器时,配置时钟分割X/(时钟分割+1)

c.初始化定时器时,预分频。X/(时钟分割+1)/(预分频系数+1)

d.得到定时器的时钟输入频率。

e.设置自动重装载寄存器(计数值),得到定时器的频率输出 X/(时钟分割+1)/(预分频系数+1)/计数值

其次,判断可更改的变量来改变频率输出。

本次试验选取更改预分频系数,作为控制变量。

7.转换占空比

duty=TIM2_CCR1/TIM2_ARR

本次试验选择改变TIM2_CCR1。

3.心得:


1.参考了网上一些pwm案例,觉得有些案例实现起来,调用了一些不需要的函数,效率下降。


2.本次学习仅仅总结了PWM输出的用法,对定时器的其他功能认知仍存在大量不足。


3.第一次,写这么长的总结,很有成就感。


关键字:stm32  单片机  可调节pwm输出 引用地址:基于stm32单片机的可调节pwm输出

上一篇:STM32 TIM1输出互补波形
下一篇:STM32 PWM的输出与Keil软件仿真

推荐阅读最新更新时间:2024-03-16 16:07

stm32 运行时间测量与间隔执行
这个程序利用stm32普通定时器构成了执行时间测量功能和间隔执行函数功能,使用如下,两种功能复用,通过#define选择 //执行时间测试模式下 #define StopWatch //使用: #include Runtime.h Runtime_init(); while(1){ Runtime_start(); delay_ms(1); Runtime_stop(); delay_ms(1000); } //setInterval模式 #define setInterval setInterval(fun,1000);//传入回调,周期1.024*1000ms c文件
[单片机]
单片机联网,UIP实现tcp/udp协议
UIP是单片机界联网的一个很好地选择,移植这个库有点复杂,首先是第一步,网卡驱动要写好,使用的网卡芯片为ENC28J60,驱动可以再工程包里面找到 //配置网卡硬件,并设置MAC地址 //返回值:0,正常;1,失败; u8 tapdev_init(u8* macaddr) { u8 i,res=0; res=ENC28J60_Init((u8*)macaddr); //初始化ENC28J60 //把IP地址和MAC地址写入缓存区 for (i = 0; i 6; i++)uip_ethaddr.addr =macaddr ; //指示灯状态:0x4
[单片机]
东芝基于Arm Cortex-M3且具备先进功能的低功耗微控制器
东京-- 东芝电子元件及存储装置株式会社(“东芝”)面向消费设备和工业设备推出“M3H族”微控制器,成功扩大其基于Arm® Cortex®-M的“TXZ™系列”微控制器的产品阵容。 该新微控制器目前已批量生产。 根据产品功能,M3H族分为两个产品组。“M3H族(1)”提供标准功能,而“M3H族(2)”提供更多封装和存储容量选项,并支持高速处理器(80MHz)。两个产品组共提供13种丰富的封装选项(32引脚至144引脚)和32KB-512KB的闪存。 M3H族基于全球标准的Arm Cortex-M3内核,专为电机控制而设计,可满足消费设备和工业设备的各种需求。M3H族(1)的工作频率高达40MHz;M3H族(2)的工作频率高达80
[工业控制]
东芝基于Arm Cortex-M3且具备先进功能的低功耗<font color='red'>微控制器</font>
基于单片机和CAN控制器的嵌入式系统
1. 引言   单片机作为嵌入式设备的心脏,在从消费电子到工业应用等广泛的领域中得到应用。从单片机的历史来看,随着嵌入式设备对单片机功能和性能的要求提高,其经历了从4位机到8位机的发展过程。目前嵌入式产品的不断发展,8bit单片机的处理能力面对越来越多的挑战。而32bit单片机在嵌入式领域得到越来越多的应用。根据市场的发展,EPSON 公司专为高级数据处理的便携式设备推出了32位MCU(Microcontroller Unit )S1C33 系列,下面简单介绍一下EPSON 32 位单片机的特点:   A. 强大的CPU内核:S1C33采用RISC(精简指令集)结构,三级流水线,105条16位长指令,其大多数指令在一个时钟周
[单片机]
基于<font color='red'>单片机</font>和CAN控制器的嵌入式系统
stm32复位电阻设置过小导致的各类症状
STM32F103T8U6,焊接时误将复位电容的上拉电阻焊成10欧,出现症状有: 烧写一次程序后,程序无法运行,无法第二次烧写程序。烧写到最后,会报错:Error: Flash Download failed - cortex-M3 但是此时jtag仍然能够连上芯片。 将烧写设置改为erase full chip,烧写到错后,报错显示: Contents mismatch at: 08000000H (Flash=FFH Required=00H) ! Contents mismatch at: 08000001H (Flash=FFH Required=04H) ! Contents mismatch at: 0
[单片机]
基于STM32单片机的盆栽系统设计
一.系统设计 本次盆栽系统的设计使用STM32单片机作为控制中心,通过光敏模块检测光照强度,通过DHT11测量温湿度,通过土壤湿度传感器检测土壤湿度,检测到的数据通过LCD显示屏显示,当土壤湿度低于下限时,继电器控制灌溉,当土壤湿度高于上限时,继电器控制除湿,当温度低于阈值时,继电器控制加热,当光强低于阈值时,继电器控制补光。 图1 系统框图 二.硬件设计 本设计所采用的STM32F103C8T6是以Cortex-3为核心的单片机,它的功能是实现软件的执行,并对外部的器件、模块进行控制。该系统由LCD显示模块,温湿度检测模块,光敏电阻模块,湿度检测模块,继电器模块组成。 图2 硬件电路 三.软件设计 系统的软件实现过程中首
[单片机]
基于<font color='red'>STM32</font><font color='red'>单片机</font>的盆栽系统设计
基于STM32从零写操作系统系列---将printf指向串口输出
为什么需要printf? 首先,这个printf不是标准C中的printf,这个printf是自己参考标准库实现的。只是简单地完成了打印输出int,long long int, unsigned int, unsigned long long int, float, double和十六进制数等功能。主要用于在以后的学习中,输出变量、寄存器等的数据,便于调试程序。 1.函数调用中的参数传递 根据《Procedure Call Standard for the ARM ® Architecture》(文章结尾有下载分享)这个文档可知,标准规定在寄存器(r0-r3)和堆栈中传递参数。对于采用少量参数的子程序,仅使用寄存器,大大减少了
[单片机]
基于<font color='red'>STM32</font>从零写操作系统系列---将printf指向串口<font color='red'>输出</font>
IAR全面支持小华全系芯片,强化工控及汽车MCU生态圈
IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片,加速高端工控MCU和车用MCU应用的安全开发 中国,上海 – 2024年3月7日 - 嵌入式开发软件和服务的全球领导者IAR与小华半导体有限公司(以下简称“小华半导体”)联合宣布, IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片 ,涵盖通用控制、电机控制、汽车电子、超低功耗四大产品线,用户可通过IAR嵌入式工具安全且高效地开发小华半导体全系列芯片,降低项目成本,加速产品上市。 小华半导体是中国电子信息产业集团有限公司旗下集成电路业务平台华大半导体有限公司的核心子公司。小华半导体以技术创新为动力
[嵌入式]
IAR全面支持小华全系芯片,强化工控及汽车<font color='red'>MCU</font>生态圈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved