PWM

#include "sys.h"
#include "beep.h"

//tim5 定时器  

/*
tim4 定时器 定时10分钟 控制LED1
*/

void my_tim5_init()
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
    NVIC_InitTypeDef  NVIC_InitStruct;
    //1.打开时钟
    RCC_APB1Peri phClockCmd(RCC_APB1Periph_TIM5, ENABLE);

    //2.TIM_TimeBaseInit
    // 配置定时器
/*
    void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
    TIM_TypeDef  控制器基地址 TIM1~14 

    TIM_TimeBaseInitTypeDef
    uint16_t TIM_Prescaler;  分频系数
    功能:用于分频
    范围:数字
    寄存器:PSC

    uint16_t TIM_CounterMode; 计数模式
    范围:TIM_CounterMode_Up TIM_CounterMode_Down
    寄存器:CR1  4 5 6 三位

    uint32_t TIM_Period;   自动重载寄存器
    范围:
    寄存器:ARR  

    uint16_t TIM_ClockDivision;

    uint8_t TIM_RepetitionCounter;

    2s  42MHz *2 = 84MHz
    */
    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
    //16位 防止溢出
    TIM_TimeBaseStruct.TIM_Period = 20000 -1;
    TIM_TimeBaseStruct.TIM_Prescaler= 8400-1;
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct);

  //打开中断
/*
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

TIM_IT  中断的标志
TIM_IT_Update  更新中断

NewState   状态
ENABLE  DISABLE
*/
    TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);

    NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;
    NVIC_Init(&NVIC_InitStruct);

}

extern u32 jfees;
//2S 一次 如何产生10分钟的定时
void TIM5_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) {
    //    BEEP = !BEEP;
        jfees++;

        TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
    }
}

//占空比:一个时钟周期高电平所占的比例
//PWM  外设 需要一个特定的波形
//外设需要不同的电压来控制
//BEEP  PF8 通过production_data.pdf     TIM13_CH1
//PF8 可以 TIM13 的第一个通道

//tim13  控制器
void timer13_init()
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);

    //PF8 配置成复用模式
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOF, &GPIO_InitStruct);

    //把PF8 复用为TIM13功能,就可以把PF8作为 TIM13的一个通道
    GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13 );

    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
    //16位 防止 溢出
    TIM_TimeBaseStruct.TIM_Period = 300 -1;
    TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
    TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStruct);

    //PWM的配置
    //CCMR1  OC1M  4~6
    //111 PWM2     CNT > CCR1  输出有效电平
    //110 PWM1     CNT < CCR1  输出有效电平

    //CCER 1位 配置有效电平
/*
void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
使用不同的通道需要调用不同的函数
通道1   TIM_OC1Init

 uint16_t TIM_OCMode;
 功能:配置PWM的模式
 范围:TIM_OCMode_PWM1  TIM_OCMode_PWM2

 uint16_t TIM_OutputState;
 功能:PWM通道使能 开关
 范围:TIM_OutputState_Disable TIM_OutputState_Enable
 寄存器:CCER 0位

 uint16_t TIM_OCPolarity;
 功能:有效电平
 范围:TIM_OCPolarity_High TIM_OCPolarity_Low
 寄存器:CCER 1位

*/
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OC1Init(TIM13, &TIM_OCInitStruct);

/*
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
x 1~4
只有调用该函数 那么才能修改CCR1的值

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
*/
    TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM13, ENABLE);

    TIM_Cmd(TIM13, ENABLE);
}

//tim14  控制器
void timer14_init()
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

    //PF9 配置成复用模式
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(GPIOF, &GPIO_InitStruct);

    //把PF9 复用为TIM14功能,就可以把PF9 作为TIM14的一个通道
    GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14 );

    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
    //16位 防止 溢出
    TIM_TimeBaseStruct.TIM_Period = 300 -1;
    TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
    TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStruct);

    //PWM的配置
    //CCMR1  OC1M  4~6
    //111 PWM2     CNT > CCR1  输出有效电平
    //110 PWM1     CNT < CCR1  输出有效电平

    //CCER 1位  有效电平
/*
void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
使用不同的通道需要调用不同的函数
通道1   TIM_OC1Init

 uint16_t TIM_OCMode;
 功能:配置 PWM的模式
 范围TIM_OCMode_PWM1  TIM_OCMode_PWM2

 uint16_t TIM_OutputState;
 功能:PWM通道使能 开关
 范围:TIM_OutputState_Disable TIM_OutputState_Enable
 寄存器:CCER 0位

 uint16_t TIM_OCPolarity;
 功能:有效电平
 范围:TIM_OCPolarity_High TIM_OCPolarity_Low
 寄存器:CCER 1位

*/
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OC1Init(TIM14, &TIM_OCInitStruct);

/*
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
x 1~4
只有调用该函数 那么才能修改CCR1的值

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
*/
    TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM14, ENABLE);

    TIM_Cmd(TIM14, ENABLE);
}
    while(1)
    {

//        if(jfees >=  time + 5)
//        {
//            BEEP = !BEEP;
//            time = jfees;
//        }
        if(dir==0) val++;
        else if(dir==1) val--;

        if(val==300) dir=1;
        else if(val==0)dir=0;

        //TIM_SetComparen
        //设置 CCR1 比较寄存器的值
        TIM_SetCompare1(TIM14, val);

        delay_ms(10);
    }
时间: 2024-10-05 02:57:39

PWM的相关文章

基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

CC1310生成PWM波

工作中因为时间紧迫,我不得不抛开TI提供的TI-RTOS.sdk和xdctools等工具,采用ucos + 库函数的方式去开发.最开始一头扎进去,碰见的就PWM的生成. PWM方面,TI自带封装好了PWM函数进行pwm的生成. 假如:我的需求是PWM的周期是2s,占空比50%,MCU主频是48MHz.于是我直接设置 params.periodUnits = PWM_PERIOD_US; params.periodValue = pwmPeriod; params.dutyUnits = PWM_

HAL之PWM

PWM是定时器的一个输出功能,要分配在有对应输出的管脚上.分频和定时值决定了周期,捕获寄存器的值就是占空比,当计数寄存器的值小于捕获值时输出固定电平(H),当大于时翻转电平,当计数器值溢出时将重载值载入,此时继续翻转电平. 一 在stm32cubeMX中线在有对应PWM输出的引脚设置PWM功能 二 在外设功能TIMx的对应通道上设置PWM模式 三在定时器配置时设置分频值,定时值,如果设置paulse则为固定pwm输出:或者这里不设置写一个设置函数,然后在while中不断修改paulse,则Pau

STM32定时器输出PWM频率和步进电机控制速度计算

1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知: 当APB1和APB

51单片机模拟PWM调制控制实验

-------------------------------------------- PWM(脉冲宽度调制) 对模拟信号电平进行数字编码的方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 设计要求: 由于AT89系列单片机没有PWM控制器,所以

51单片机PWM

由定时器产生PWM信号,可手动按键调节PWM的占空比,按键由外部中断实现 #include <reg51.h> #include <intrins.h> #define CYCLE 6000 //周期6000 * 1us = 6ms #define SCALE (CYCLE / 100) //比例 1% #define ONE 0x10 #define TWO 0x01 #define THREE 0x40 #define FOUR 0x04 typedef unsigned ch

STM32中的PWM的频率和占空比的设置

转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和PSC寄存器, 确定PWM频率.这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB

STM32F0xx_TIM输出PWM配置详细过程

前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形. 我提供的软件工程直接调用是比较简单就能实现想要的PWM波形.但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助. 本着免费分享的原则,如果你觉得分享的内容对你有用,认可我分

5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)

本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 中级教程-OSAL操作系统(OSAL系统解基本套路) 中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~ 中级教程-OSAL操作系统(ADC-光敏电阻) OSAL操作系统-实验16 串口波特率扩展 OSAL操作系统-实验1

树莓派的PWM脉宽调制功能介绍

最近想用树莓派控制航模的电调,于是研究了下PWM,貌似控制电调比较麻烦,因为电调需要发送几个特定的信号启动,然后才能进入控制模式,今天先弄明白PWM,慢慢折腾.下面的程序亲测可用,我用的树莓派model B,12GPIO口是外面第6个针. 脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法.在树莓派上,可以通过对GPIO的编程来实现PWM. 创建一个 PWM 实例: GPIO.PWM(channel, frequency) 启用 PWM: p.