STM32系列 PWM输出

 

复制代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
//ALIENTEK战舰STM32开发板实验9
//PWM输出实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 

void sendback(void)
{
      unsigned char t;
    
        for(t=0;t<myusart.recount;t++)
        {
            USART_SendData(USART1, myusart.rcbuf[t]);//向串口1发送数据
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
        }    
}
void Com_Handle(void)
{
    unsigned long long arr=0;
    unsigned int psc=0;
  //数据格式判断
    if((myusart.rcbuf[0]!= 0xaa) || (myusart.rcbuf[myusart.recount-1]!=0xff))//头码是否为0xaa,结束码是否为0xff
    {
        return;

    }
    else
    {
        //如何处理四个数据,四字节转成一个数
        //00  00   A0  28
        arr=(myusart.rcbuf[1]<<24)+(myusart.rcbuf[2]<<16)+ (myusart.rcbuf[3]<<8) + myusart.rcbuf[4];
        psc=5000;         //占空比50%=5000/10000;
        set_pwm1(arr,psc);
    //是否需要回复,发什么回复什么
        sendback();
            
  }
    
}


int main(void)
{        
    delay_init();             //延时函数初始化      
    NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);     //串口初始化为115200
    LED_Init();                 //LED端口初始化
//    TIM3_PWM_Init(900-1,0);     //不分频。PWM频率=72000k/900=80Khz
    TIM3_PWM_Init(3-1,250-1);     //
    TIM2_Int_Init(999,71); //1ms
    while(1)
    {
        if(myusart.reflag>0)
        {
            Com_Handle();//收到什么回复什么;    
            myusart.recount=0;
            myusart.reflag=0;
        }

    }     
}
main
复制代码
复制代码
//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
 GPIO_InitTypeDef GPIO_InitStructure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 使能GPIOB时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 // 配置IO模式
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 复用推挽复用输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);            
 //初始化TIM3的计数模式、分频值、重装载值等
 TIM_TimeBaseStructure.TIM_Period = arr;  //ARR
 TIM_TimeBaseStructure.TIM_Prescaler = psc; //PSC
 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 向上计数模式 
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

 /*TIM3_CH1输出占空比为20%的PWM波的定时配置*/
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 选择定时器模式:TIM脉冲宽度调制模式1
 TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;// 比较输出使能
 TIM_OCInitStructure.TIM_Pulse = (arr+1)/2;  //CCR
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 输出极性:TIM输出比较极性高
 TIM_OC1Init(TIM3, &TIM_OCInitStructure);

 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);// 使能TIM3在OC1上的预装载寄存器
 
 TIM_Cmd(TIM3, ENABLE);//使能TIM3时钟
}

void set_pwm1(unsigned long long arr,unsigned int psc)//例如set_pwm1(41000,1000);// 这样就是41KHZ,10%  1000/10000=10%
{
        double T_ARR,DPwm_CCR2;
        unsigned int PWM_Per=0,TIM1_CCR1=0;

//        T_ARR=(double)72000000/arr; 
        T_ARR=(double)288000/arr; 
        DPwm_CCR2=(double)(T_ARR * psc)/10000;

        T_ARR=T_ARR+0.5;//四舍五入算法
        DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法

        //    PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);
        PWM_Per = (unsigned int)T_ARR;

        TIM1_CCR1 =DPwm_CCR2;
    
      TIM_SetAutoreload(TIM3,PWM_Per-1);
      TIM_SetCompare1(TIM3,TIM1_CCR1-1);
    
}
TIM3_PWM_Init
复制代码

 

posted @   不折不扣  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示