#include \#include \
//定时器3中断服务程序 void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { // LED1=!LED1; }
TIM3->SR&=~(1<<0);//清除中断标志位 }
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc) {
RCC->APB1ENR|=1<<1; //TIM3时钟使能 TIM3->ARR=arr; //设定计数器自动重装值 TIM3->PSC=psc; //预分频器设置 TIM3->DIER|=1<<0; //允许更新中断 TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2 }
void TIM2_PWM_Init(u16 arr,u16 psc) { //此部分需手动修改IO口设置 RCC->APB1ENR|=1<<0; //TIM2时钟使能 RCC->APB2ENR|=1<<2; //使能PORTA时钟 PA0,PA1,PA2,PA3 GPIOA->CRL&=0XFFFFFFF0; //PA0清除之前的设置 GPIOA->CRL|=0X0000000B; //复用功能输出 1011 每四位控制一个IO低八位用CRL高八位CRH //后两位00表示输入状态;此时前两位00模拟输入;01浮空输入;10上拉/下拉输入;11保留 //后两位01/10/11分别表示10/20/50MHz的输出速度;此时前两位00通用推完输出;01通用开漏输出;10复用推挽;11复用开漏 GPIOA->CRL&=0XFFFFFF0F; //PA1清除之前的设置 GPIOA->CRL|=0X000000B0; //复用功能输出 GPIOA->CRL&=0XFFFFF0FF; //PA2清除之前的设置 GPIOA->CRL|=0X00000B00; //复用功能输出 GPIOA->CRL&=0XFFFF0FFF; //PA3清除之前的设置 GPIOA->CRL|=0X0000B000; //复用功能输出 TIM2->ARR=arr; //设定计数器自动重装
值 TIM2->PSC=psc; // // 效 // // // // 效
//预分频器不分频
TIM2->CCMR1|=6<<4; TIM2->CCMR1|=6<<12; TIM2->CCMR2|=6<<4; TIM2->CCMR2|=6<<12;
TIM2->CCMR1|=1<<3; TIM2->CCMR1|=1<<11; TIM2->CCMR2|=1<<3; TIM2->CCMR2|=1<<11;
TIM2->CCER|=1<<0; TIM2->CCER|=1<<1; TIM2->CCER|=1<<0; TIM2->CCER|=1<<4; TIM2->CCER|=1<<8; TIM2->CCER|=1<<12;
TIM2->CCER|=3<<0; TIM2->CCER|=3<<4; TIM2->CCER|=3<<8; TIM2->CCER|=3<<12;
//CH1 PWM1模式 //CH2 PWM1模式 //CH3 PWM1模式 //CH4 PWM1模式
//CH1 预装载使能 //CH2 预装载使能 //CH3 预装载使能 //CH4 预装载使能
//OC1 输出使能 //OC1 低电平有效 //OC1 输出使能,高电平有效 //OC2 输出使能,高电平有效 //OC3 输出使能,高电平有效 //OC4 输出使能,高电平有
//OC1 输出使能,低电平有效 //OC2 输出使能,低电平有效 //OC3 输出使能,低电平有效 //OC4 输出使能,低电平有
TIM2->CR1|=1<<7; //ARPE使能 自动重载预装载
TIM2->CR1|=1<<0; //使能定时器2 }
#ifndef __TIMER_H #define __TIMER_H #include \
/******************************************************************************** 本程序中共预设了八个通道的PWM输出,使用高级定时器1和通用定时器2
********************************************************************************/ //#define LED0_PWM_VAL TIM1->CCR1 #define CH11_PWM_VAL TIM1->CCR1 #define CH12_PWM_VAL TIM1->CCR2 #define CH13_PWM_VAL TIM1->CCR3 #define CH14_PWM_VAL TIM1->CCR4
#define CH21_PWM_VAL TIM2->CCR1 #define CH22_PWM_VAL TIM2->CCR2 #define CH23_PWM_VAL TIM2->CCR3 #define CH24_PWM_VAL TIM2->CCR4
void TIM3_Int_Init(u16 arr,u16 psc); void TIM1_PWM_Init(u16 arr,u16 psc); void TIM2_PWM_Init(u16 arr,u16 psc); #endif
下面用于电调初始化设置
int main(void) while(1)
//状态判断
{
if(NRF24L01_RxPacket(tmp_buf)==0) //若收到数据信息. { TIM2_PWM_Init(19999,71); //定时器2初始化 启动频率1000 000Hz;PWM频率=1000 000/(19999+1)= 50Hz if(tmp_buf[8]==0x00&tmp_buf[9]==0x00) //判断是否为一般遥控模式 { CH21_PWM_VAL = 1000; //设置最小值 CH22_PWM_VAL = 1000; //设置最小值 CH23_PWM_VAL = 1000; //设置最小值 CH24_PWM_VAL = 1000; //设置最小值 break;
//跳出死循环
}
if(tmp_buf[8]==0xf0&tmp_buf[9]==0x00)
//判断是否为设置电调最大值 { CH21_PWM_VAL = 2000; //设置最大值 CH22_PWM_VAL = 2000; //设置最大值 CH23_PWM_VAL = 2000; //设置最大值 CH24_PWM_VAL = 2000; //设置最大值
}
if(tmp_buf[8]==0xf0&tmp_buf[9]==0xf0) //判断是否为设置电调最小值 { CH21_PWM_VAL = 1000; //设置最小值 CH22_PWM_VAL = 1000; //设置最小值 CH23_PWM_VAL = 1000; //设置最小值 CH24_PWM_VAL = 1000; //设置最小值
}
//71+1分频;计数
} }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库STM32f103PWM(用于电调)程序在线全文阅读。
相关推荐: