OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2872|回复: 1

求助 关于STM32产生PWM位数的问题

[复制链接]

4

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2015-11-3
在线时间
31 小时
发表于 2016-7-19 23:51:36 | 显示全部楼层 |阅读模式
5金钱
最近在做一个pwm控制,对精度要求非常高,我用原子哥的列程更改的程序 占空比0%~100%对应的CCR1寄存器的值为0~2000,不是说好的16位 最大值不应该是65535吗?这样控制精度就不够,我初学者欢迎各位大侠指导!

下面是程序


初始化:TIM3_PWM_Init(1999,72);         //72分频。PWM频率=1000000/2000=500hz


#include "pwm_out.h"
#include "led.h"



//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{                                                                   
        if(TIM3->SR&0X0001)//溢出中断
        {
                LED1=!LED1;                                                                                                                       
        }                                  
        TIM3->SR&=~(1<<0);//清除中断标志位             
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<1;        //TIM3时钟使能   
        TIM3->ARR=arr;          //设定计数器自动重装值//刚好1ms   
        TIM3->PSC=psc;          //预分频器7200,得到10Khz的计数时钟                  
        TIM3->DIER|=1<<0;   //允许更新中断          
        TIM3->CR1|=0x01;    //使能定时器3
        MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2                                                                         
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //此部分需手动修改IO口设置
        RCC->APB1ENR|=1<<1;         //TIM3时钟使能   
        RCC->APB2ENR|=1<<4;            //使能PORTC时钟       
       
        GPIOC->CRL&=0X00FFFFFF;        //PC6,7输出
        GPIOC->CRL|=0XBB000000;        //复用功能输出                    
        GPIOC->CRH&=0XFFFFFF00;        //PC8,9输出
  GPIOC->CRH|=0X000000BB; //复用功能输出        
       
        RCC->APB2ENR|=1<<0;     //开启辅助时钟          
        AFIO->MAPR&=0XFFFFF3FF; //清除MAPR的[11:10]
        AFIO->MAPR|=3<<10;      //部分全映像,TIM3 CH1 CH2 CH3 CH4 的PWM脉冲波形  GPIOC-> 6,7,8,9  

        TIM3->ARR=arr;                        //设定计数器自动重装值
        TIM3->PSC=psc;                        //预分频器不分频
       
        TIM3->CCMR1|=7<<4;          //CH1 PWM2模式                 
        TIM3->CCMR1|=1<<3;             //CH1预装载使能          
        TIM3->CCER|=1<<0;           //OC1 输出使能
           
       
        TIM3->CCMR1|=7<<12;          //CH2 PWM2模式                6<<12 PWM1模式  
        TIM3->CCMR1|=1<<11;         //CH2预装载使能          
        TIM3->CCER|=1<<4;           //OC2 输出使能


        TIM3->CCMR2|=7<<4;          //CH3 PWM2模式                 
        TIM3->CCMR2|=1<<3;             //CH3预装载使能          
        TIM3->CCER|=1<<8;           //OC3 输出使能

               
        TIM3->CCMR2|=7<<12;          //CH4 PWM2模式                 
        TIM3->CCMR2|=1<<11;         //CH4预装载使能          
        TIM3->CCER|=1<<12;           //OC4 输出使能

        TIM3->CR1=0x0080;           //ARPE使能  自动重装寄存器
        TIM3->CR1|=0x01;            //使能定时器3                                        


}           


void Motor_PWM_Update(u16 motor1_pwm,u16 motor2_pwm,u16 motor3_pwm,u16 motor4_pwm)
{               
        if(motor1_pwm        >        MOTOR_PWM_MAX)        motor1_pwm = MOTOR_PWM_MAX;
        if(motor2_pwm        >        MOTOR_PWM_MAX)        motor2_pwm = MOTOR_PWM_MAX;
        if(motor3_pwm        >        MOTOR_PWM_MAX)        motor3_pwm = MOTOR_PWM_MAX;
        if(motor4_pwm        >        MOTOR_PWM_MAX)        motor4_pwm = MOTOR_PWM_MAX;
       
        if(motor1_pwm        <        MOTOR_PWM_MIN)        motor1_pwm = MOTOR_PWM_MIN;
        if(motor2_pwm        <        MOTOR_PWM_MIN)        motor2_pwm = MOTOR_PWM_MIN;
        if(motor3_pwm        <        MOTOR_PWM_MIN)        motor3_pwm = MOTOR_PWM_MIN;
        if(motor4_pwm        <        MOTOR_PWM_MIN)        motor4_pwm = MOTOR_PWM_MIN;

        TIM3->CCR1 = motor1_pwm;//PC6
        TIM3->CCR2 = motor2_pwm;//PC7
        TIM3->CCR3 = motor3_pwm;//PC8
        TIM3->CCR4 = motor4_pwm;//PC9

}


void Motor_PWM1_Update(u16 motor1_pwm)
{               
        if(motor1_pwm        >        MOTOR_PWM_MAX)        motor1_pwm = MOTOR_PWM_MAX;       
        if(motor1_pwm        <        MOTOR_PWM_MIN)        motor1_pwm = MOTOR_PWM_MIN;
        TIM3->CCR1 = motor1_pwm;//PC6

}
void Motor_PWM2_Update(u16 motor2_pwm)
{               

        if(motor2_pwm        >        MOTOR_PWM_MAX)        motor2_pwm = MOTOR_PWM_MAX;
        if(motor2_pwm        <        MOTOR_PWM_MIN)        motor2_pwm = MOTOR_PWM_MIN;
        TIM3->CCR2 = motor2_pwm;//PC7

}
void Motor_PWM3_Update(u16 motor3_pwm)
{               
        if(motor3_pwm        >        MOTOR_PWM_MAX)        motor3_pwm = MOTOR_PWM_MAX;
        if(motor3_pwm        <        MOTOR_PWM_MIN)        motor3_pwm = MOTOR_PWM_MIN;

        TIM3->CCR3 = motor3_pwm;//PC8

}

void Motor_PWM4_Update(u16 motor4_pwm)
{               
        if(motor4_pwm        >        MOTOR_PWM_MAX)        motor4_pwm = MOTOR_PWM_MAX;
        if(motor4_pwm        <        MOTOR_PWM_MIN)        motor4_pwm = MOTOR_PWM_MIN;
        TIM3->CCR4 = motor4_pwm;//PC9

}



















最佳答案

查看完整内容[请看2#楼]

问题已经解决,是我把定时器初值设置成了1999
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2015-11-3
在线时间
31 小时
 楼主| 发表于 2016-7-19 23:51:37 来自手机 | 显示全部楼层
问题已经解决,是我把定时器初值设置成了1999
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 00:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表