
我这个没有调试过;仅作参考。
//=============================================================================
//定时器4初始化,向上计数,自动装载,作为PWM,在Pb6~Pb9输出,
void Tim4_Init(void)
{
// volatile uint32_t tpdw1;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitdata; //基本参数
TIM_OCInitTypeDef TIM_OCInitStructure; //PWM输出,
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //开启tim4的clk,
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,ENABLE); //通过对应位设置使Tim4寄存器复位,
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,DISABLE); //退出复位,
//----Pb6~Pb9对应GPIO口初始化----------------------------------------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时钟,
GPIO_InitStructureGPIO_Pin = GPIO_Pin_6|GPIO_Pin_7
|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//----Tim4基本参数的初始化----------------------------------------------------
TIM_TimeBaseInitdataTIM_Prescaler = 0x0; //设置tim的预分频系数=0,72M全频,
TIM_TimeBaseInitdataTIM_ClockDivision = TIM_CKD_DIV1; //设置tim的时钟分频因子,Tdts=nTck_int,
TIM_TimeBaseInitdataTIM_CounterMode = TIM_CounterMode_Up; //向上计数,
TIM_TimeBaseInitdataTIM_Period = 0x3fff; //设置tim的自动重载,14位分辨率约439K,
TIM_TimeBaseInitdataTIM_RepetitionCounter = 0x00; //仅用于tim1&tim8,
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitdata);
TIM_ARRPreloadConfig(TIM4,ENABLE); //允许Tim2计数器的ARR自动重载缓冲,
//----Tim4的CHx_PWM的初始化参数,-----------------------------------------------
TIM_OCInitStructureTIM_OCMode=TIM_OCMode_PWM1; //设置OC1M[2:0]为pwm1输出模式,OC1REF="1"为有效,
TIM_OCInitStructureTIM_Pulse=0x1fff; //设置占空比时间,值将自动写入CCR1,
TIM_OCInitStructureTIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性,CCER的CC1P位,实际1=OC1REF的有效电平,
TIM_OCInitStructureTIM_OutputState=TIM_OutputState_Enable; //使能该通道输出,CCER的CC1E位,
//----高级定时器才有的参数,----------------------------------------------------
TIM_OCInitStructureTIM_OCIdleState=TIM_OCIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISx,只有Tim1/8有,
TIM_OCInitStructureTIM_OCNIdleState=TIM_OCNIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISxN,只有Tim1/8有,
TIM_OCInitStructureTIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性,CCER的CC1NP位,
TIM_OCInitStructureTIM_OutputNState=TIM_OutputNState_Disable; //无互补端输出,CCER的CC1NE位,
//----按照指定参数初始化TIM_OC1~4,
TIM_OC1Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC1,
TIM_OC1FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器,CCMR1_OC1PE=1,
TIM_OC2Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC2,
TIM_OC2FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器,CCMR1_OC2PE=1,
TIM_OC3Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC3,
TIM_OC3FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR3上的预装载寄存器,CCMR2_OC3PE=1,
TIM_OC4Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC4,
TIM_OC4FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR4上的预装载寄存器,CCMR2_OC4PE=1,
//----定时器启动-----------------------
TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE); //关中断,
TIM_ClearFlag(TIM4,TIM_FLAG_Update); //必须先清除配置时候产生的更新标志,
TIM_Cmd(TIM4,ENABLE); //使能定时器,
}
这个挺简单的吧
不知道你的DSP设置情况,我就说下我怎么设置吧。我设置的DSP频率是150M,你要发的PWM波周期是20KHz,设置连续增减模式,计数的最大值应该设为150M/40k=3750,你在设置比较值,如果占空比是50%,就设一半。然后你设个计数值,确定是什么时候开通哪个PWM,定义个flag就可以
了,设置为012,到了你的PWM长度就加1,到3时清0,等于0开PWM1,1开PWM2,2开PWM3就ok了。
看来你是想用串口中断 定时器查询方式 串口中断程序里面为什么会有//这个符号呢?应该去掉吧,//这个是注释用的。还有既然发生中断了RI就肯定是等于1了,没有必要判断是否等于1。另外主程序第一句前面也要去掉//。编程要严谨啊。
PWM0 37
PWM1 35
#include "reg51h"
#include "intrinsh"
#define FOSC 18432000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
/Declare SFR associated with the PCA /
sfr CCON = 0xD8; //PCA control register
sbit CCF0 = CCON^0; //PCA module-0 interrupt flag
sbit CCF1 = CCON^1; //PCA module-1 interrupt flag
sbit CR = CCON^6; //PCA timer run control bit
sbit CF = CCON^7; //PCA timer overflow flag
sfr CMOD = 0xD9; //PCA mode register
sfr CL = 0xE9; //PCA base timer LOW
sfr CH = 0xF9; //PCA base timer HIGH
sfr CCAPM0 = 0xDA; //PCA module-0 mode register
sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW
sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH
sfr CCAPM1 = 0xDB; //PCA module-1 mode register
sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW
sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH
sfr CCAPM2 = 0xDC; //PCA module-2 mode register
sfr CCAP2L = 0xEC; //PCA module-2 capture register LOW
sfr CCAP2H = 0xFC; //PCA module-2 capture register HIGH
sfr CCAPM3 = 0xDD; //PCA module-3 mode register
sfr CCAP3L = 0xED; //PCA module-3 capture register LOW
sfr CCAP3H = 0xFD; //PCA module-3 capture register HIGH
sfr PCAPWM0 = 0xF2;
sfr PCAPWM1 = 0xF3;
sfr PCAPWM2 = 0xF4;
sfr PCAPWM3 = 0xF5;
void main()
{
CCON = 0; //Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x02; //Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave
PCAPWM1 = 0x03;
CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1; //PCA timer start run
while (1);
}
#include <reg52h> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit KEY1= P3^4; //定义按钮
sbit KEY2= P3^5; //定义按钮
sbit PWM= P1^7;//PWM输出的管脚定义
#define PERIOD 1000 //pwm周期
#define MIN_POSITIVE 100 //最小占空比100/1000
#define MAX_POSITIVE 900 //最大占空比900/1000
#define STEP 10 //步长
uint POSITIVE=MIN_POSITIVE;
void delay(uint i)//延时函数
{
while(--i);
}
void init_timer0()//设置定时器
{
TMOD=0X01;
TL0=(POSITIVE-PERIOD)%256;//具体怎么实现的你看一下51单片机定时器的东西,TLO,THO。
TH0=(POSITIVE-PERIOD)/256;
ET0=1;
}
void init_timer1() // 初始化定时器
{
TMOD|=0X10;
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
ET1=1;
EA=1;
}
void TIMER0_ISR(void)interrupt 1 //中断响应函数
{
TL0=(POSITIVE-PERIOD)%256;
TH0=(POSITIVE-PERIOD)/256;
TR0=0;
TR1=1;
PWM=0;
}
void TIMER1_ISR(void)interrupt 3 //中断响应函数
{
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
TR1=0;
TR0=1;
PWM=1;
}
void key_scan() 按钮扫描函数
{
uint step=0;
step=(PERIOD-MIN_POSITIVE-100)/STEP;
KEY1=1;
KEY2=1;
if(KEY1==0||KEY2==0)
{
delay(100);
if(KEY1==0)
{
POSITIVE+=step;
if(POSITIVE>MAX_POSITIVE)
POSITIVE=MAX_POSITIVE;
}
if(KEY2==0)
{
POSITIVE-=step;
if(POSITIVE<MIN_POSITIVE)
POSITIVE=MIN_POSITIVE;
}
while(KEY1==0||KEY2==0);
}
}
void main() //主函数
{
init_timer0();
init_timer1();
TR0=1;
while(1)key_scan();
}
//这里的意思就是高电平使用一个定时器,低电平使用一个定时器,其实可以使用一个定时器就可以完成这个任务。他的左右只是1ms响应一个中断,然后计数。
//
#include <REGX51H>
#define TIMER0_COUNT 0xFC18 //每秒中端1000次
unsigned long int m,a;
static void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
m++;
}
static void timer0_initialize(void)
{
EA=0; / 设定系统不接受所有的中断 /
m=0;
TR0=0; / 关闭Timer0 /
TMOD =0x01; / 设定计时器0为16位的工作模式 /
TL0=(TIMER0_COUNT & 0x00FF); / 设定TL0的数值 /
TH0=(TIMER0_COUNT >> 8); / 设定TH0的数值 /
PT0=0; / 设定计时器0有比较高的优先级 /
ET0=1; / 设定接受Timer0的中断 /
TR0=1; / 启动Timer0 /
EA=1; / 设定系统接受中断 /
}
void main (void)
{
timer0_initialize();
P2_0=0;
P2_1=1;
P3_0=0;
P3_1=1;
a=25;
while(1)
{
if(m==a)
{
P2_2=0;
P3_2=0;
}
if(m==50)
{
P2_2=1;
P3_2=1;
m=0;
}
}
}
//
这是我之前写的程序,你看看吧。希望对你有帮助,这个好理解点
以上就是关于STM32F103求配置一个PWM输出的程序,要求如下全部的内容,包括:STM32F103求配置一个PWM输出的程序,要求如下、请教DSP28335输出类似下面的pwm波形程序,具体实现或者方法都可以、51单片机 用 串口控制 输出 PWM 波形 这程序为什么不行求高手指教。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)