STM32--如何产生8路PWM波

发布者:会弹琴的鲸鱼3312最新更新时间:2017-10-26 来源: eefocus关键字:STM32  PWM波形 手机看文章 扫描二维码
随时随地手机看文章

实验描述:PA0,PA1,PA2,PA3,PA8,PA9,PA10,PA11输出不同占空比的PWM波

程序清单:

#include"PWM.H"

#include "stm32f10x.h"

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //启动GPIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动AFIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //启动TIM1,功能复用IO时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能或者失能APB1外设时钟,RCC_APB1Periph_TIM2 为TIM2时钟 ,这里的意思是使能TIM4时钟

//Step2. GPIO做相应设置,为AF输出,使能TIM时钟

//PA.0,1,2,3,8,9,10,11口设置为TIM1的OC1输出口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8 | GPIO_Pin_9|GPIO_Pin_10 | GPIO_Pin_11;

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

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//端口速率为50Mhz

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化

}

//Step3. TIM模块初始化

void TIM_Configuration(void)

{

     TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;//初始化TIM的固定格式, 根据TIM_TimeBaseInitStruct中指定的参数初始化//TIMx的时间基数单位

     TIM_OCInitTypeDef TIM_OCInitStructure;// 根据TIM_OCInitStruct中指定的参数初始化外设TIMx

     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

     //TIM1基本计数器设置(设置PWM频率)

     //频率=TIM1_CLK/(ARR+1)  频率为1khz

     TIM_BaseInitStructure.TIM_Period = 1000-1;

     TIM_BaseInitStructure.TIM_Prescaler = 72-1;

     TIM_BaseInitStructure.TIM_ClockDivision = 0;

     TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

     TIM_BaseInitStructure.TIM_RepetitionCounter = 0;

     TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

     

     TIM_ARRPreloadConfig(TIM1, ENABLE);//启用ARR的影子寄存器(直到产生更新事件才更改设置)

     TIM_ARRPreloadConfig(TIM2, ENABLE);  

    

     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//TIM1_OC1模块设置(设置1通道占空比)

TIM_OCInitStructure.TIM_Pulse = 100;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)

//TIM1_OC2模块设置(设置2通道占空比)

TIM_OCInitStructure.TIM_Pulse = 300;

TIM_OC2Init(TIM1, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)

//TIM1_OC3模块设置(设置2通道占空比)

TIM_OCInitStructure.TIM_Pulse = 600;

TIM_OC3Init(TIM1, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//启用CCR3寄存器的影子寄存器(直到产生更新事件才更改设置)

//TIM1_OC3模块设置(设置2通道占空比)  

TIM_OCInitStructure.TIM_Pulse = 900;

TIM_OC4Init(TIM1, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)

    

  

     //死区设置

     TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

     TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

     TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;

     TIM_BDTRInitStructure.TIM_DeadTime = 0x90;   //这里调整死区大小0-0xff

     TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;

     TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;

     TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

     TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

     //TIM1基本计数器设置(设置PWM频率)

     //频率=TIM1_CLK/(ARR+1)  频率为1khz

     TIM_BaseInitStructure.TIM_Period = 1000-1;

     TIM_BaseInitStructure.TIM_Prescaler = 72-1;

     TIM_BaseInitStructure.TIM_ClockDivision = 0;

     TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

     TIM_BaseInitStructure.TIM_RepetitionCounter = 0;

     TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);

  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //其中,TIM_OCMode选择定时器模式,TIM_OCMode_PWM1 ,TIM脉冲宽度调制模式1

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //状态使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity输出极性,其输出极性为高

 

TIM_OCInitStructure.TIM_Pulse =100;//TIM_Pulse设置了待装入捕获比较寄存器的脉冲值

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse =300;//TIM_Pulse设置了待装入捕获比较寄存器的脉冲值

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse =600;//TIM_Pulse设置了待装入捕获比较寄存器的脉冲值

TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse =900;//TIM_Pulse设置了待装入捕获比较寄存器的脉冲值

TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);   //TIM_OC1PreloadConfig使能或者失能TIMx在CCR1上的预装载寄存器

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);    //CCR2为捕获/比较寄存器2 

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);    //CCR3为捕获/比较寄存器2 

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);    //CCR4为捕获/比较寄存器2 

TIM_Cmd(TIM1, ENABLE); //TIM1,2开启

TIM_Cmd(TIM2, ENABLE);

TIM_CtrlPWMOutputs(TIM1, ENABLE); //TIM1_OC通道输出PWM(一定要加)

}


关键字:STM32  PWM波形 引用地址:STM32--如何产生8路PWM波

上一篇:STM32-高级定时器TIM1的应用
下一篇:STM32 串口的简单配置

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

玩转STM32(3)使用模板工程
前面学习了安装什么样的软件,这时就已经具备开发嵌入式软件的基本条件。只要把前面的开发板电源使用USB的电源线插入5V的电源,然后把JLink的USB插头插入到开发的电脑,硬件就已经连接好了。如下图这样连接起来: 在这里一定要注意使用电源供电,而不能使用JLink的供电,因为CPU和外围元件的电压会不稳定,导致调试时,CPU可以下载和运行代码,但外围元件工作不正常的现象。这里都是使用USB接头,电源的USB接头可以插入到手机充电器,现在的手机充电器都能提供比较大的功率。同时手机充电器也随处可见,随时可以买得到,使用这样的电源是最方便的。 当你把硬件按这样接好之后,就可以进入软件开发了。但是这时候,你就感觉到迷茫了,到底怎么样
[单片机]
玩转<font color='red'>STM32</font>(3)使用模板工程
初学stm32-Systick滴答时钟定时
滴答定时器概述 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
[单片机]
初学stm32-Systick滴答时钟定时
STM32多通道ADC规则转换实现
vu16 ADC_RCVTab ; //自己添加 int main(void) { #ifdef DEBUG debug(); #endif RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); LcdShow_Init(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟 DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A
[单片机]
STM32 查看 FLASH 和 RAM 使用情况(RO-data、RW-data、ZI-data)
1、KEIL MDK 编译后的信息 Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 1)Code 是代码占用的空间; 2)RO-data 是 Read Only 只读常量的大小,如const型; 3)RW-data 是(Read Write)初始化了的可读写变量的大小; 4)ZI-data 是(Zero Initialize) 没有初始化的可读写变量的大小,ZI-data不会被算做代码里因为不会被初始化。 1.1、Flash 占用 在烧写的时候是 FLASH 中的被占用的空间为: Code+RO Data+RW Data 1.2、RAM 内存
[单片机]
STM32单片机-PWM波形输出
一、引脚映像与寄存器 1、定时器引脚复用功能映像 ----------------------------------------------------------- 2、定时器 1)定时器介绍 STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器SysTick。 其中TIM1和TIM8能够产生3对WM互补输出,常用于三相电机的驱动,时钟由APB2的输出产生; TIM2~TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。
[单片机]
<font color='red'>STM32</font>单片机-<font color='red'>PWM</font><font color='red'>波形</font>输出
STM32单片机学习总结之中断EXTI (External interrupt)
学习内容: EXTI (External interrupt) 就是指外部中断,通过GPIO 检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。 1、能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为0~15 的称为内核异常,而16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。把编号从-3 至6 的中断向量定义为系统异常,编号为负 的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号7 开始的为外部中断,
[单片机]
<font color='red'>STM32</font>单片机学习总结之中断EXTI (External interrupt)
STM32串口如何代码实现更稳定的接收消息
在 《STM32串口向世界问好》介绍过如何发送消息,那么又如何接收消息呢? 也很简单,只需要配置好串口接收,配置好中断,并在串口中断函数里面进行数据接收就可以了。通用配置代码如下: /** * @brief 初始化IO 串口1 * @param bound:波特率 * @retval None */void USART1_Debug_Init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
[单片机]
<font color='red'>STM32</font>串口如何代码实现更稳定的接收消息
STM32开发中的位带操作机制
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。 如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。 想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。 官方给出了如下相应的计算公式: AliasAddr=0x42000000+((A‐0
[单片机]
<font color='red'>STM32</font>开发中的位带操作机制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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