初级会员

- 积分
- 169
- 金钱
- 169
- 注册时间
- 2015-11-3
- 在线时间
- 31 小时
|
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
}
|
|