asp做bs網(wǎng)站怎么寫(xiě)網(wǎng)頁(yè)百度網(wǎng)站優(yōu)化
目錄
文章目錄
前言
學(xué)習(xí)目標(biāo)
學(xué)習(xí)內(nèi)容
PWM
pwm原理
需求
開(kāi)發(fā)流程
初始化PWM
PWM占空比控制
main函數(shù)修改duty
輸出通道
關(guān)心的內(nèi)容
重要的關(guān)鍵詞
周期
分頻
占空比
總結(jié)
前言
在微控制器開(kāi)發(fā)中,理解和掌握PWM(脈寬調(diào)制)技術(shù)以及與定時(shí)器的關(guān)系是至關(guān)重要的。PWM技術(shù)可以廣泛應(yīng)用于工業(yè)自動(dòng)化、電機(jī)控制、LED調(diào)光等領(lǐng)域,通過(guò)改變信號(hào)的脈沖寬度來(lái)控制電路輸出。本文將介紹PWM原理、開(kāi)發(fā)流程,以及如何通過(guò)定時(shí)器實(shí)現(xiàn)PWM功能。通過(guò)學(xué)習(xí)本文,您將掌握通用定時(shí)器開(kāi)發(fā)流程,理解周期、分頻系數(shù)、周期計(jì)數(shù)、分頻計(jì)數(shù)等概念,以及掌握分頻計(jì)數(shù)、周期計(jì)數(shù)和占空比的計(jì)算策略。
學(xué)習(xí)目標(biāo)
- 理解PWM和定時(shí)器的關(guān)系
- 掌握通用定時(shí)器開(kāi)發(fā)流程
- 理解周期,分頻系數(shù),周期計(jì)數(shù),分頻計(jì)數(shù)。
- 掌握分頻計(jì)數(shù)、周期計(jì)數(shù)和占空比的計(jì)算策略
學(xué)習(xí)內(nèi)容
PWM
PWM全稱(chēng)是脈寬調(diào)制(Pulse Width Modulation),是一種通過(guò)改變信號(hào)的脈沖寬度來(lái)控制電路輸出的技術(shù)。PWM技術(shù)在工業(yè)自動(dòng)化、電機(jī)控制、LED調(diào)光等領(lǐng)域廣泛應(yīng)用。
PWM是一種將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)的技術(shù),它通過(guò)改變信號(hào)的占空比來(lái)控制輸出的電平。
在ARM32系列芯片中,PWM輸出的頻率和占空比可以由程序控制,因此可以用來(lái)控制各種電機(jī)、燈光和其他設(shè)備的亮度、速度等參。
在ARM32系列芯片中,PWM的調(diào)制是通過(guò)Timer來(lái)實(shí)現(xiàn)的。PWM與引腳相關(guān),除了基本定時(shí)器以外,其他類(lèi)型的Timer都可以作為PWM來(lái)進(jìn)行使用。
pwm原理
CHxCV是輸入捕獲和輸出比較寄存器
需求
以PD14
對(duì)應(yīng)的LED4為例,我們做一個(gè)呼吸燈的效果。
我們采用TIMER3CH2進(jìn)行實(shí)現(xiàn):
開(kāi)發(fā)流程
- 添加Timer依賴(lài)
- 初始化PWM
- PWM占空比控制
初始化PWM
#define PRESCALER 10 // [1, 65536]
#define FREQ 1000 // 1000Hz// 保證分母 (FREQ * PRESCALER) >= 2564
#define PERIOD SystemCoreClock / (FREQ * PRESCALER)// TIMER3_CH2
static void Timer_config() {// 通用定時(shí)器// GPIO PD14 =================================================================rcu_periph_clock_enable(RCU_GPIOD);gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_14);gpio_af_set(GPIOD, GPIO_AF_2, GPIO_PIN_14);// TIMER3C0 =================================================================// 初始化定時(shí)器配置rcu_periph_clock_enable(RCU_PERIPH);timer_deinit(TIMER_PERIPH);// 升級(jí)頻率rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);// 初始化參數(shù)timer_parameter_struct initpara;/* initialize TIMER init parameter struct */timer_struct_para_init(&initpara);/* 根據(jù)需要配置值 */initpara.prescaler = PRESCALER - 1; // 分頻系數(shù) (可以實(shí)現(xiàn)更低的timer頻率)// 1個(gè)周期的計(jì)數(shù)(period Max: 65535) Freq > 2564initpara.period = PERIOD - 1;/* initialize TIMER counter */timer_init(TIMER_PERIPH, &initpara);// TIMER通道輸出配置timer_oc_parameter_struct ocpara;/* 初始化結(jié)構(gòu)體參數(shù) initialize TIMER channel output parameter struct */timer_channel_output_struct_para_init(&ocpara);/* 啟用TM1 CH0的OP極(正極) */ocpara.outputstate = (uint16_t)TIMER_CCX_ENABLE;/* 配置輸出參數(shù)configure TIMER channel output function */timer_channel_output_config(TIMER_PERIPH, TIMER_CH, &ocpara);/* 配置通達(dá)輸出比較模式 configure TIMER channel output compare mode */timer_channel_output_mode_config(TIMER_PERIPH, TIMER_CH, TIMER_OC_MODE_PWM0);/* 設(shè)置通道輸出脈沖值 (修改占空比) configure TIMER channel output pulse value */timer_channel_output_pulse_value_config(TIMER_PERIPH, TIMER_CH, (PERIOD - 1) * 1.0f);/* enable a TIMER */timer_enable(TIMER_PERIPH);
}
PWM占空比控制
void PWM_update(float duty) { // 0 -> 100if(duty > 100) {duty = 100;} else if (duty < 0) {duty = 0;}// pulse / (PERIOD - 1) == duty / 100;uint32_t pulse = (PERIOD - 1) * duty / 100.0f;/* 設(shè)置通道輸出脈沖值 (修改占空比) configure TIMER channel output pulse value */timer_channel_output_pulse_value_config(TIMER_PERIPH, TIMER_CH, pulse);}
main函數(shù)修改duty
int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);systick_config();USART0_init();Timer_config();printf("Init Complete!\n");PWM_update(0);float duty = 0;int dir = 1;while(1) {// printf發(fā)送字符串// 0 -> (PERIOD - 1) -> 0 -> ....if(duty >= 100) {dir = -1;} else if(duty <= 0) {dir = 1;}duty += dir;PWM_update(duty);delay_1ms(10);}
}
輸出通道
這里完整配置為多種:
void timer_channel_output_struct_para_init(timer_oc_parameter_struct *ocpara)
{/* initialize the channel output parameter struct member with the default value */ocpara->outputstate = (uint16_t)TIMER_CCX_DISABLE;ocpara->outputnstate = TIMER_CCXN_DISABLE;ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH;ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH;ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW;ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
}
我們具體的可以分為兩類(lèi):
ocpara->outputstate = (uint16_t)TIMER_CCX_DISABLE;
ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH;
ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW;
ocpara->outputnstate = TIMER_CCXN_DISABLE;
ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH;
ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
特別觀(guān)察API,帶N的為反向,帶P的為正向。賦值的結(jié)果常量也是需要注意是否帶N。
P和N的配置主要出現(xiàn)在互補(bǔ)PWM中,如果當(dāng)前的Timer不是高級(jí)定時(shí)器,那么就不具備互補(bǔ)的功能,那么我們一律認(rèn)為他是P類(lèi)型,也就是設(shè)置P才有用。
通過(guò)設(shè)置outputstate 的 ENABLE來(lái)控制輸出通道的開(kāi)啟。
關(guān)心的內(nèi)容
- 哪個(gè)定時(shí)器
- 哪個(gè)引腳輸出pwm
- 周期和分頻系數(shù)
重要的關(guān)鍵詞
周期
pwm中,一個(gè)周期就是一次高低電平的變化。
分頻
將原來(lái)的活增加幾倍時(shí)間干完。
占空比
1個(gè)周期內(nèi),高電平出現(xiàn)的比例。
總結(jié)
本文詳細(xì)介紹了PWM技術(shù)以及與定時(shí)器的關(guān)系,通過(guò)示例代碼演示了在ARM32系列芯片中如何實(shí)現(xiàn)PWM功能。首先,我們了解了PWM技術(shù)是如何將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào),并通過(guò)改變占空比來(lái)控制輸出電平的。接著,我們學(xué)習(xí)了開(kāi)發(fā)流程,包括如何初始化PWM以及如何控制PWM占空比。最后,我們通過(guò)具體的代碼示例演示了如何在實(shí)際開(kāi)發(fā)中應(yīng)用PWM技術(shù),實(shí)現(xiàn)呼吸燈效果。通過(guò)本文的學(xué)習(xí),相信您已經(jīng)掌握了有關(guān)PWM和定時(shí)器的基本知識(shí)和開(kāi)發(fā)技巧,希望本文能夠?qū)δ膶W(xué)習(xí)和開(kāi)發(fā)有所幫助。