步驟1:說明
這個(gè)世界上的每個(gè)人都有一些慣性。每次通電時(shí),電動(dòng)機(jī)都會旋轉(zhuǎn)。一旦關(guān)閉電源,它將趨于停止。但是它不會立即停止,需要一些時(shí)間。但是在它完全停止之前,它再次通電!因此,它開始運(yùn)動(dòng)。但是即使到現(xiàn)在,也要花一些時(shí)間才能達(dá)到最大速度。但是在它發(fā)生之前,它已經(jīng)關(guān)閉電源,依此類推。因此,此動(dòng)作的整體效果是電動(dòng)機(jī)連續(xù)旋轉(zhuǎn),但轉(zhuǎn)速較低。
脈沖寬度調(diào)制(PWM)是一種相對較新的功率切換技術(shù),用于在完全打開和完全關(guān)閉水平。通常,數(shù)字脈沖具有相同的開啟和關(guān)閉時(shí)間周期,但是在某些情況下,我們需要數(shù)字脈沖具有更多/更少的開啟時(shí)間/關(guān)閉時(shí)間。在PWM技術(shù)中,我們創(chuàng)建具有不相等數(shù)量的導(dǎo)通和截止?fàn)顟B(tài)的數(shù)字脈沖,以獲得所需的中間電壓值。
占空比由一個(gè)完整數(shù)字脈沖中高電壓持續(xù)時(shí)間的百分比定義??梢酝ㄟ^以下方式計(jì)算:
占空比的百分比= T/T(周期)x 100
讓我們提出問題陳述。我們需要生成一個(gè)占空比為45%的50 Hz PWM信號。
頻率 = 50 Hz
時(shí)間段,T = T(on)+ T(off)= 1/50 = 0.02 s = 20 ms
占空比 = 45%
因此,根據(jù)上述方程式求解,我們得到
T(on)= 9毫秒
T(off )= 11毫秒
步驟2:AVR計(jì)時(shí)器-PWM模式
制作PWM時(shí),AVR包含單獨(dú)的硬件!通過使用它,CPU指示硬件產(chǎn)生特定占空比的PWM。 ATmega328具有6個(gè)PWM輸出,其中2個(gè)位于定時(shí)器/計(jì)數(shù)器0(8位)上,2個(gè)位于定時(shí)器/計(jì)數(shù)器1(16位)上,2個(gè)位于定時(shí)器/計(jì)數(shù)器2(8位)上。定時(shí)器/計(jì)數(shù)器0是ATmega328上最簡單的PWM器件。定時(shí)器/計(jì)數(shù)器0可以在三種模式下運(yùn)行:
快速PWM
相位和頻率校正PWM
相位校正PWM
每個(gè)這些模式可以反轉(zhuǎn)也可以不反轉(zhuǎn)。
在PWM模式下初始化Timer0:
TCCR0A | =(1 《-設(shè)置WGM:快速PWM
TCCR0A | =(1 《-設(shè)置比較輸出模式A ,B
TCCR0B | =(1 《-使用預(yù)分頻器= 256設(shè)置計(jì)時(shí)器
:光強(qiáng)度測量-ADC和LDR。
Light依存電阻器(LDR)是一種傳感器,當(dāng)光落在其表面變化時(shí)會改變其電阻。
LDR由半導(dǎo)體材料制成,以使其具有光敏特性。這些LDR或光電電阻的工作原理是“光電導(dǎo)”?,F(xiàn)在,該原理說的是,每當(dāng)光落在LDR的表面上時(shí)(在這種情況下),元件的電導(dǎo)就會增加,換句話說,當(dāng)光落在LDR的表面時(shí),LDR的電阻會減小。由于它是表面上使用的半導(dǎo)體材料的特性,因此實(shí)現(xiàn)了LDR電阻降低的特性。 LDR通常用于檢測光的存在或測量光的強(qiáng)度。
要將外部連續(xù)信息(模擬信息)傳輸?shù)綌?shù)字/計(jì)算系統(tǒng)中,必須將其轉(zhuǎn)換為整數(shù)(數(shù)字)。 )值。此類轉(zhuǎn)換由模數(shù)轉(zhuǎn)換器(ADC)進(jìn)行。將模擬值轉(zhuǎn)換為數(shù)字值的過程稱為模擬到數(shù)字轉(zhuǎn)換。簡而言之,模擬信號是我們周圍的真實(shí)世界信號,如聲音和光。
數(shù)字信號是數(shù)字或數(shù)字格式的模擬等效項(xiàng),微控制器等數(shù)字系統(tǒng)已經(jīng)很好地理解了。 ADC是一種可測量模擬信號并產(chǎn)生相同信號的數(shù)字等效信號的硬件。 AVR微控制器具有內(nèi)置的ADC功能,可將模擬電壓轉(zhuǎn)換為整數(shù)。 AVR將其轉(zhuǎn)換為0到1023范圍內(nèi)的10位數(shù)字。
我們使用帶有LDR的分壓器電路的電壓電平進(jìn)行模數(shù)轉(zhuǎn)換,以測量光強(qiáng)度。
初始化ADC:
TADCSRA | =(1 《-啟用ADC
ADCSRA | =(1 《-設(shè)置ADC預(yù)分頻器= 128
ADMUX =(1 《-設(shè)置參考電壓= AVCC; -設(shè)置輸入通道= ADC0
觀看視頻,并詳細(xì)介紹ADC AVR微控制器:AVR微控制器。光強(qiáng)度測量。 ADC和LDR
第4步:控制器直流電動(dòng)機(jī)和雙H橋電動(dòng)機(jī)驅(qū)動(dòng)器模塊-L298N
我們使用直流電動(dòng)機(jī)驅(qū)動(dòng)器是因?yàn)槲⒖刂破魍ǔ2荒芴峁┎怀^100毫安的電流。微控制器很聰明,但功能不強(qiáng)。該模塊將為微控制器增加一些動(dòng)力,以驅(qū)動(dòng)大功率直流電動(dòng)機(jī)。它可以同時(shí)控制2個(gè)直流電機(jī),每個(gè)電機(jī)最多2安培,或者一個(gè)步進(jìn)電機(jī)。我們可以使用PWM及其電機(jī)的旋轉(zhuǎn)方向來控制速度。此外,它還用于驅(qū)動(dòng)LED膠帶的亮度。
引腳說明:
OUT1 和 OUT2 端口,用于連接直流電動(dòng)機(jī)。 OUT3 和 OUT4 用于連接 LED膠帶。
ENA 和 ENB 是啟用引腳:通過將 ENA 連接到高電平(+ 5V),可以啟用端口 OUT1 和 OUT2 。
如果將 ENA 引腳連接到低電平(GND),則會禁用 OUT1 和 OUT2 。同樣,對于 ENB 和 OUT3 和 OUT4 。
IN1 到 IN4 是將連接到AVR的輸入引腳。
如果 IN1 -高(+ 5V), IN2 -低(GND),則 OUT1 變高,并且 OUT2 變低,因此我們可以驅(qū)動(dòng)電動(dòng)機(jī)。
如果 IN3 -高(+ 5V), IN4 -低( GND), OUT4 變高而 OUT3 變低,因此LED膠帶燈亮。
如果要反轉(zhuǎn)電動(dòng)機(jī)只是反轉(zhuǎn) IN1 和 IN2 極性,對于 IN3 和 IN4 也是如此。
將 PWM 信號應(yīng)用于 ENA 和 ENB ,您可以控制兩個(gè)不同輸出端口上的電動(dòng)機(jī)速度。
板可以接受從 7V 到 12V 的標(biāo)稱值。
跳線:共有三個(gè)跳線引腳; 跳線1 :如果您的電動(dòng)機(jī)需要超過 12V 的電源,則必須斷開跳線1 并施加所需的電壓(最大 35V )在 12V 終端上。帶上另一個(gè) 5V 電源,并在 5V 端子上輸入。是的,如果您需要施加超過 12V 的電壓(移除了 Jumper 1 時(shí)),則必須輸入 5V 。
5V 輸入用于 IC 的正常運(yùn)行,因?yàn)樾断绿€將禁用內(nèi)置的 5V 穩(wěn)壓器并防止更高的輸入來自 12V 端子的電壓。
如果您的電源介于 7V 至 12V之間,則 5V 端子用作輸出。 ,如果您施加的電壓大于 12V ,則用作輸入
,并且跳線被移除。
跳線2和跳線3:您必須移除這兩個(gè)跳線,而必須輸入來自微控制器的啟用和禁用信號,大多數(shù)用戶更喜歡移除這兩個(gè)跳線并施加來自微控制器的信號。
如果您將這兩個(gè)跳線保留為 OUT1 至 OUT4 將始終處于啟用狀態(tài)。記住 OUT1 和 OUT2 的 ENA 跳線。 OUT3 和 OUT4 的 ENB 跳線。
步驟5:用C語言編寫程序代碼。將HEX文件上傳到微控制器閃存中
使用集成開發(fā)平臺-Atmel Studio以C代碼編寫和構(gòu)建AVR微控制器應(yīng)用程序。
#ifndef F_CPU
#define F_CPU 16000000UL // telling controller crystal frequency (16 MHz AVR ATMega328P)
#endif
#include //header to enable data flow control over pins. Defines pins, ports, etc.
#include //header to enable delay function in program
#define BUTTON1 2 // button switch connected to port B pin 2
#define DEBOUNCE_TIME 25 // time to wait while “de-bouncing” button
#define LOCK_INPUT_TIME 300 // time to wait after a button press
// Timer0, PWM Initialization
void timer0_init()
{
// set up timer OC0A,OC0B pin in toggle mode and CTC mode
TCCR0A |= (1 《《 COM0A1)|(1 《《 COM0B1)|(1 《《 WGM00)|(1 《《 WGM01);
// set up timer with prescaler = 256
TCCR0B |= (1 《《 CS02);
// initialize counter
TCNT0 = 0;
// initialize compare value
OCR0A = 0;
}
// ADC Initialization
void ADC_init()
{
// Enable ADC, sampling freq=osc_freq/128 set prescaler to max value, 128
ADCSRA |= (1《
ADMUX = (1《// Select Voltage Reference (AVCC)
// Button switch status
unsigned char button_state()
{
/* the button is pressed when BUTTON1 bit is clear */
if (!(PINB & (1《
{
_delay_ms(DEBOUNCE_TIME);
if (?。≒INB & (1《
}
return 0;
}
// Ports Initialization
void port_init()
{
DDRB =0b00011011; //PB0-IN1, PB1-IN2,PB3-IN3, PB4-IN4, PB2 - BUTTON SWITCH DIRECT
PORTB=0b00010110;
DDRD =0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A)
PORTD=0b00000000;
DDRC =0b00000000; // PC0-ADC
PORTC=0b00000000; // Set all pins of PORTC low which turns it off.
}
// This function reads the value of the analog to digital convert.
uint16_t get_LightLevel()
{
_delay_ms(10); // Wait for some time for the channel to get selected
ADCSRA |= (1《 // Start the ADC conversion by setting ADSC bit. Write 1 to ADSC
while(ADCSRA & (1《// Wait for conversion to complete
// ADSC becomes 0 again till then, run loop continuously
_delay_ms(10);
return(ADC); // Return the 10-bit result
}
// This function Re-maps a number from one range (0-1023) to another (0-100)。
uint32_t map(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
int main(void)
{
uint16_t i1=0;
port_init();
timer0_init();
ADC_init(); // initialization ADC
while (1)
{
i1=map(get_LightLevel(),0,1023,0,100);
OCR0A=i1; // Set output compare register channel A
OCR0B=100-i1; // Set output compare register channel B (inverted)
if (button_state()) // If the button is pressed, toggle the LED‘s state and delay for 300ms (#define LOCK_INPUT_TIME)
{
PORTB ^= (1《《0); // toggling the current state of the pin IN1.
PORTB ^= (1《《1); // toggling the current state of the pin IN2. Reverse the rotational direction of the motor
PORTB ^= (1《《3); // toggling the current state of the pin IN3.
PORTB ^= (1《《4); // toggling the current state of the pin IN4. LED Tape is turn off/on.
_delay_ms(LOCK_INPUT_TIME);
}
};
return (0);
}
編程完成了。接下來,將項(xiàng)目代碼構(gòu)建并編譯到十六進(jìn)制文件中。
將HEX文件上傳到微控制器閃存中:
在DOS提示符窗口中鍵入以下命令:
avrdude –c [程序員名稱] –p m328p –u –U flash:w:[您的十六進(jìn)制文件的名稱]
在我的情況下是:
avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex
此命令將十六進(jìn)制文件寫入微控制器的內(nèi)存。觀看視頻,詳細(xì)介紹微控制器閃存的刻錄:微控制器閃存的刻錄。..
好!現(xiàn)在,微控制器按照我們程序的指令工作。讓我們檢查一下!
步驟6:電路
根據(jù)原理圖連接組件
插入電源,并且可以正常工作!
-
脈沖寬度調(diào)制
+關(guān)注
關(guān)注
7文章
81瀏覽量
13744
發(fā)布評論請先 登錄
相關(guān)推薦
評論