① 怎么用51单片机设定pwm的输出频率麻烦具体说明
这个实现起来丰俭由人,可以有三种办法:
1,纳蠢软件定时,一段时间输出高,一段时间输出低,加起来就是PWM周期;
2,用硬件定时器代替软件定时,会准确,原理还是散态一样的;
3,带有PCC、TIM等高级专用计数器的,设置好寄存器之后,自动出来想要的频率和占空比,又准确又省心,频率还可以很高;洞掘陪
具体到单片机型号,可以找厂商的应用笔记,源代码的有。
② 51单片机同时输出不同频率方波
可粗仿睁岩岁以使用多个定时器,每个定时器输出不同的方波频率。
每个定时器的计数器应配置为对应的频率,并使用每个定时器的比较寄存器生成方波。可以使用引脚分配多个方波,大姿也可以使用外部设备(例如,模拟输出)。
请确保编写程序以使用多个定时器,并且不会对其他功能造成影响。
下面是一个使用51单片机同时输出不同频率方波的简单示例(使用 C 语言):
#include <reg51.h>
unsigned int counter1, counter2;
void Timer0_Init()
{
TMOD = 0x01; // 设置 Timer0 为模式 1(16 位计数器)
TH0 = 0xFC; // 初始化频率为 1kHz 的方波
TL0 = 0x67;
TR0 = 1; // 启动 Timer0
}
void Timer1_Init()
{
TMOD = ((TMOD & 0x0F) | 0x10); // 设置 Timer1 为模式 1(16 位计数器)
TH1 = 0xFD; // 初始化频率为 500Hz 的方波
TL1 = 0x4B;
TR1 = 1; // 启动 Timer1
}
void main()
{
P0 = 0x00; // 初始化 P0 引脚为低电平
Timer0_Init();
Timer1_Init();
while(1)
{
if(TF0 == 1) // Timer0 比较寄存器中断
{
TF0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
counter1++;
if(counter1 == 1000) // 每隔 1000 个计数周期,改变 P0 引脚状态
{
counter1 = 0;
P0 = ~P0;
}
}
if(TF1 == 1) // Timer1 比较寄存器中断
{
TF1 = 0;
TH1 = 0xFD;
TL1 = 0x4B;
counter2++;
if(counter2 == 500) // 每隔 500 个计数周期,改变 P0 引脚状态
{
counter2 = 0;
P0 = ~P0;
}
}
}
}
希望能帮到你
③ ISE的DDS ip核,怎么设置可以输出1MHz的sin和cos,而我的采样频率是210KHz,就是欠采样。
最简单的来说,AVR单片机就有直接的做扒PWM输出功能,只要将其中几个寄存器配置好就可以了:假如使用FWM方式,输入的频率为1MHz,则有ICR寄存器设置PWM周期,则有:
ICR=0:持续输出高电平。
ICR=1:频率为1M/(1+1)=500KHz
ICR=2:频率为1M/(2+1)=333.333KHz
ICR=3:1M/(3+1)=250KHz
ICR=4:1M/(4+1)=200KHz
ICR=5:1M/(5+1)=166.000KHz
这样一直到ICR=65535时,输出频率为1M/(65535+1)=15Hz。
由此可知,直接使用单片机是不行的了,不能滑型实现向你说的1~5000这样的“连续”信胡猜频率变化,那就只能使用DDS实现。即楼上说的AD8950芯片。
不过我想确定一点:真的需要频率连续变化的PWM么?还是频率不变,占空比连续变化的?
④ stc8h单片机如何设置pwm频率
首先,STC8H不需要外部晶振和外部复位,也可以外接。它的时钟4M-36M。和其它stc芯片的区别是它的运行速度够快,8路16位的高级pwm定时器,4路可以输出互补的脉冲信号,在用这个芯片的时候我发现手册上有些地方讲的不亮银喊是太清楚,对照了32的手册才明白了原理,今天着重说一下高级定时器的那部分。
STC8H 系列的单片机内部集成了 8 通道 16 位高级 PWM 定时器,分成两组周期可不同的 PWM,分别命名为 PWMA 和 PWMB可分别单独设置。第一组 PWM/PWMA 可配置成 4 组互补/对称/死区控制的 PWM 或捕捉外部信号,第二组 PWM/PWMB 可配置成 4 路 PWM 输出或捕捉外部信号。
pwmA可配置成输出比较,输入捕获以及pwm模式,pwm有边沿对齐以及中间对齐模式,可直接驱动一些小型的电机,在驱动一些小型的电机时一定要将相应的io口配成推挽输敬野出在,不然驱动不起来,具体的原理就不写了,主要说一下主要寄存器以及主要模式的配置。
选择计数器时钟(内部、外部或者预分频器(PSCR)),我用的都是内部。
预分频器看你想要输出的频率范围自己设置
2. 将相应的数据写入 PWMA_ARR(设频率) 和 PWMA_CCRi (设占空比)寄存器中。频率=时钟/(PSCR+1)/(ARR+1)
3. 如果要产生一个中断请求,设置 CCiIE 位,在中断判断SR1状态位,PWMA和PWMB不是一个中断号。
4. 选择输出模式步骤:
1. 设置 OCiM=011,在计数器与 CCRi 匹配时翻转 OCiM 管脚的输出
2. 设置 OCiPE = 0,禁用预装载寄存器
3. 设置 CCiP = 0,选择高电平为有效电平,开始输出高电平。
4. 设置 CCiE = 1,使能输出
5. 设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
输入捕获配置:
先设置PSCR,根据你的所测频率范围来设数据。设ARR一般为最大值
1.选择有效输入端,设置 PWMA_CCMR1 寄存器中的 CC1S=01,此时通道被配置为输入,并且PWMA_CCR1 寄存器变为只读。
2. 根据输入信号 TIi 的特点,可通过配置 PWMA_CCMR1 寄存器中的 IC1F 位来设置相应的输入滤波器的滤波时间。假设输入信号在最多搏桐 5 个时钟周期的时间内抖动,我们须配置滤波器的带宽长于 5 个时钟周期;因此我们可以连续采样 8 次,以确认在 TI1 上一次真实的边沿变换,即在PWMA_CCMR1 寄存器中写入 IC1F=0011,此时,只有连续采样到 8 个相同的 TI1 信号,信号才为有效(采样频率为 fMASTER)。
3. 选择 TI1 通道的有效转换边沿,在 PWMA_CCER1 寄存器中写入 CC1P=0(上升沿)。
4. 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写 PWMA_CCMR1 寄存器的 IC1PS=00)。
5. 设置 PWMA_CCER1 寄存器的 CC1E=1,允许捕获计数器的值到捕获寄存器中。
6. 如果需要,通过设置
PWMA_IER 寄存器中的 CC1IE 位允许相关中断请求。
7.使能计数器设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
⑤ 用STM8S105单片机写一个输出频率为2KHz的方波,C语言 没用过stm8单片机,求入门资料。谢谢!
//此例程是通过码毕圆TIM2 CH1(PD4脚)通道来输出一个频率2K 占空比可调的方波,迟塌占空比可通过PD7脚的按键调
#include "STM8S105K.h"
typedef unsigned char u8;
typedef unsigned int u16;
u16 value;
void SystemInit(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
CLK_PCKENR1 |= 0x60; //使能TIM2与TIM3与主频连接
PD_CR2 |= 0x80; //使能PD7口外部中断
}
void GPIO_init(void)
{
PD_DDR = 0x1F; //配置PD端口的方向寄存器全输出
PD_CR1 = 0x1F; //设置PD为推挽输出
}
void TIM2_init(void) //TIM2 CH1 工作于模式1
{
TIM2_CCMR1= 0x60; // PWM 模式 1,TIM2 CH1
TIM2_CCER1= 0x03; /数埋/ CC1配置为输出
TIM2_ARRH = 0x07; // 配置PWM分辨率为10位,ARR=0x07D0
TIM2_ARRL = 0xD0; // PWM频率=8M/0x07D0=2000Hz
TIM2_CR1 |= 0x01; // 计数器使能,开始计数
}
void init_devices(void)
{
asm("sim");
SystemInit();
GPIO_init();
TIM2_init();
_asm("rim"); //开总中断
}
void main( void )
{
init_devices();
while(1)
TIM2_CCR1=value;//改变value值可改变频率
}
/****************************************************************************
*** 函数名 : @near @interrupt void TLI_IRQHandler (void)
*** 功能描述: 中断服务程序
按下PD7口按键来改变占空比
*****************************************************************************/
@near @interrupt void TLI_IRQHandler (void)
{
PD_CR2 &= 0x7F; //关PD7外部中断
value+=50;
while(value>1000)
value=0;
PD_CR2 |= 0x80; //使能PD7口外部中断
return;
}
⑥ STC单片机输出PWM信号,频率要25KHz,请大神指教,怎么实现,或者直接给我一个程序,谢谢!
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00; //设置颂携槐PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以野友
用定时器中断方式即可实现
让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每隐友次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波
⑦ 51单片机如何使 P1.0端口以1HZ的频率输出信号
现在的单片机都有PWM功能,你可以查阅你的51芯片的数据手册,配置相应的寄存器就可以了。
⑧ 3.已知STM32系统时钟频率为72 MHz,如何设置相关寄存器,实现10ms定时
实现10ms定时需要使用STM32的定时器模块,并且要将系统时钟频率设置为足够高的值。以下是实现10ms定时的步骤:
设置系统时钟:使用RCC寄存器设置PLL倍频系数,将系统时钟频率设置为72 MHz。
选择合适的定时器:在STM32中有多个定时器可供选择,根据需要选取合适衫颤手的定时器。假设在这里我们选用TIM2定时器。
配置定时器:使用TIM2的相关寄存器配置定时器的时钟源、分频系数和计数周期等参数。可以将定时器的时钟源设置为内部时钟,将分频系数设置为7200,则每秒钟定时器计数器会自增100次。
启动定时器:将TIM2的控制寄存器使能,并设置定时器计数器初值为0。
编写中断服务程序:在定时器溢出时会产生中断请求,在中断服务程序中可以进行相应的操作。例如,可以使用GPIO输出引脚控制LED闪烁。
启用全局中断:调用__enable_irq();函数启用全局中断
在以上代码中,使用了TIM2定时器,并将计数周期设置为100,即每秒钟会产生10次溢出中断。在中断服务程序中,或嫌控制LED引脚状态的改变,从而实现了10ms的定时效果。
#include "stm32f10x.h"
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
//定时器中断执行的内容
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
int main(void)
{
//开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//配置LED引脚为推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//开启TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//设置定时器参数
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200-1; //预分频系数
TIM_TimeBaseInitStruct.TIM_Period = 100-1; //自动重载计数值
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
//使能TIM2中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//启动TIM2定时器
TIM_Cmd(TIM2, ENABLE);
//注册中断服务程序
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&洞羡NVIC_InitStructure);
//启用全局中断
__enable_irq();
while(1)
{
//主循环程序
}
}
⑨ stm32用寄存器怎么调节舵机频率为50hz
舵机频率为50hz 一般是固定的吧,你需要调节的是PWM波的占空比,通过调节占空比来控制它,给你个别人写的stm32 库函数 pwm波
库函数版:
voidTIM3_PWM_Init(u16arr,u16psc)
{
GPIO_InitTypeDefGPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//Timer3部分重映射TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3CH2的PWM脉冲波形 GPIOB.5GPIOB.4
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_0;//TIM_CH2|TIM_CH1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3Channel2PWM模式
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3,&TIM_OCInitStructure);//根据T指定的参数初始化外设TIM3OC2
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIM3在CCR2上戚郑的预装载寄存器
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);//使能TIM3
}用法:高袜颂库和寄存器一样TIM3_PWM_Init(19999,71);
调占空比CCR的值选是19500~17500之间,库用TIM_SetCompare2(TIM3,"CCR");算法是20000-(500+text*7.8125);text范围好余是0~256;