當前位置:首頁 » 數據倉庫 » 如何配置寄存器實現輸出頻率
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

如何配置寄存器實現輸出頻率

發布時間: 2023-05-28 12:57:34

① 怎麼用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;