Professional Documents
Culture Documents
LỜI CẢM ƠN
Để hoàn thành được đồ án này là kết quả của toàn bộ nỗ lực của bản thân em
trong suốt thời gian theo học tại trường, là toàn bộ năng lực của em khi bắt tay vào quá
trình nghiên cứu. Để có được kết quả như ngày hôm nay chúng em không bao giờ
quên được sự giúp đỡ và sự giảng dạy rất nhiệt tình của các Thầy, Cô trong khoa Điện
– Điện Tử - Học Viên Công Nghệ Bưu Chính Viên Thông. Các Thầy, Cô là những đội
ngũ đi trước rất am hiểu về lĩnh vực khoa học kỹ thuật đã tận tình giảng dạy và giúp
chúng em hoàn thành được rất nhiều đề tài.
Em xin chân thành cảm ơn cô Vũ Anh Đào đã tận tình chỉ dạy, hướng dẫn đóng góp
những ý kiến quý báu giúp em có thể hoàn thành đề tài đúng thời gian quy định.
Em cũng xin cảm ơn đến những người bạn thân đã không ngại chia sẻ về kinh nghiệm
làm đề tài cũng như hỗ trợ các công việc để giúp nhóm em hoàn thành tốt được đề tài
này.
Em xin cảm ơn !
MỤC LỤC
ITO Indium Tin Oxide Một hợp chất oxit của thiếc
LỜI MỞ ĐẦU
Ngày nay với sự phát triển của ngành điện tử và ứng dụng điện tử đã giúp sự
sáng tạo của con người trở thành hiện thực. Các lĩnh vực của cuộc sống đều áp dụng
những thiết bị điện tử và dường như nhìn đâu trong gia đình chúng ta cũng có thiết bị
điện tử. Ngành điện tử và ứng dụng điện tử đã tạo chỗ đứng và khẳng định được tầm
quan trọng của mình đối với nhu cầu của con người.
Với những ứng dụng cho các hệ thống nhúng ngày càng trở nên phổ biến, từ
những ứng dụng đơn giản như điều khiển một chốt đèn giao thông định thời, đếm sản
phẩm trong một dây chuyền sản xuất, điều khiển tốc độ động cơ điện một chiều, một
đồng hồ thời gian thực.Đến các ứng dụng phức tạp như hệ thống điều khiển robot, bộ
kiểm soát trong nhà máy hoặc hệ thống kiểm soát các máy năng lượng hạt nhân. Các
hệ thống tự động trước đây sử dụng nhiều công nghệ khác nhau như các hệ thống tự
động hoạt động bằng nguyên lý khí. Các thiết bị, hệ thống này có chức năng xử lý và
mức độ tự động thấp so với các hệ thống tự động hiện đại được xây dựng trên nền tảng
của các hệ thống nhúng.
Trong nhiều năm trước, các dòng vi điều khiển 8051 được sinh viên dùng nhiều
với tính năng đơn giản, dễ sử dụng; AVR được sử dụng nhiều trong các cuộc thi
Robocon nhờ tốc độ sử lý khá cao, ổn định; PIC với ưu thế tốc độ cao, chi phí thấp
hơn cũng được nghiên cứu, sử dụng nhiều. Nhưng trong một vài năm trở lại đây, có
một dòng vi điều khiển mới, càng ngày càng nắm vị trí quan trọng trong các lĩnh vực
đòi hỏi tốc độ xử lý cao, sản xuất các dòng diện thoại di động smartphone, giám sát, an
ninh… Đó là họ vi điều khiển ARM. Với rất nhiều thế hệ ra đời, với nhiều tính năng,
công dụng khác nhau.
Với nhiều tính năng vượt trội của ARM và xu thế lựa chọn dòng vi điều khiển
mới ở Việt Nam nên trong đồ án tốt nghiệp này, dưới sự giúp đỡ của Cô Vũ Anh Đào,
em thực hiện đồ án “Ứng dụng lập trình điều khiển thiết bị qua wifi sử dụng chip
ARM Cortex M3 STM32F103C8T6”.
Em xin chân thành cảm ơn cô Vũ Anh Đào cùng toàn thể các thầy cô khoa Kỹ thuật
điện tử I đã tạo điều kiện và giúp đỡ em trong quá trình thực hiện đồ án tốt nghiệp này.
CHƯƠNG II. TÌM HIỂU CÁC LINH KIỆN, CÔNG NGHỆ, THIẾT BỊ
Không giống như máy thu FM trên xe ô tô, Wifi giao tiếp qua lại chủ yếu quá 2
radio sử dụng điện năng thấp hơn và phát sóng trên một khoảng cách ngắn hơn
nhiều.Hai radio cho phép người dùng web tải dữ liệu từ Internet cũng như upload các
thông tin - thậm chí là địa chỉ submit thông qua bộ đếm trình duyệt giao tiếp 2
chiều.Wifi phức tạp hơn so với vô tuyến mặt đất đó là Wifi sử dụng giao thức kết nối
Internet (Internet Protocol) để giao tiếp. Ngôn ngữ này của Internet tạo ra cấu trúc
Wifi.
Mạng wifi không dây không khác gì các hệ thống mạng thông thường. Mạng
cho phép người dùng truy xuất tài nguyên mạng ở bất kỳ địa điểm nào trong khu vực
được triển khai (home hay office). Với lượng gia tăng người sử dụng laptop thì đây là
một điều rất tuyệt vời bởi khi sử dụng mạng không dây đồng nghĩa với việc ta nói
không với những dây cáp cổ điển.
Ưu điểm di động: Cùng với sự phát triển của các mạng không dây công cộng,
người sử dụng có thể truy cập Internet ở mọi nơi. Ví dụ như ở các quán Café, người
dùng có thể truy cập Internet(mạng không dây) miễn phí.
Hiệu quả: Người sử dụng luôn duy trì kết nối mạng khi họ cần phải đi từ nơi
này tới nơi khác.
Khả năng mở rộng: Mạng wifi không dây đáp ứng tức thì khi gia tăng số lượng
người dùng. Bạn và nhiều người khác có thể sử dụng cùng 1 lúc mà không cần phải
kết nối bằng đường cáp như cách cổ điển trước đây. Với hệ thống cổ điển trước đây
nếu bạn muốn tăng thêm lượng người sử dụng mạng trong hệ thống đồng nghĩa với
việc tăng thêm bộ chia và cáp rất lằng nhằng và mất thời gian cũng như tiền bạc.
- Độ bảo mật: Môi trường kết nối không dây là không khí nên khả năng bị tấn
công của người dùng là rất cao. Tuy vậy, hiện nay các thiết bị phát wifi cũng
đã được nhà sản xuất các trang bị các biện pháp bảo mật khá hữu hiệu, đảm
bảo an toàn thông tin cá nhân cho người sử dụng.
- Phạm vi của hệ thống: Với một mạng chuẩn 802.11g, các thiết bị chuẩn chỉ có
thể hoạt động tốt nhất trong phạm vi vài chục mét. Hệ thống này phù hợp
trong một căn hộ, với một tòa nhà lớn thì hệ thống lại không đáp ứng được
nhu cầu. Giải quyết vấn đề này cần phải mua thêm Repeater hay access point,
đẫn đến chi phí gia tăng lên rất nhiều.
- Độ tin cậy: Vì sử dụng sóng vô tuyến để truyền thông nên việc bị nhiễu, tín
hiệu bị giảm do tác động của các thiết bị khác(lò vi sóng,…) là không thể
tránh khỏi. Nó làm giảm đáng kể rất nhiều hiệu quả hoạt động của mạng.
- Tốc độ: Việc sử dụng hệ thống không dây đồng nghĩa với tốc độ của mạng
không dây(1-125 Mbps) chậm hơn rất nhiều so với mạng cổ điển sử dụng cáp
(100 mbps đến hang Gbps)
một cách đồng thời. Do giá thành cao hơn nên 802.11a chỉ được sử dụng trong các
mạng doanh nghiệp còn 802.11b thích hợp hơn với thị trường mạng gia đình.
802.11a hỗ trợ băng thông lên đến 54 Mbps và sử dụng tần số vô tuyến 5GHz.
Tần số của 802.11a cao hơn so với 802.11b chính vì vậy đã làm cho phạm vi của hệ
thống này hẹp hơn so với các mạng 802.11b. Với tần số này, các tín hiệu 802.11a cũng
khó xuyên qua các vách tường và các vật cản khác hơn.
Do 802.11a và 802.11b sử dụng các tần số khác nhau, nên hai công nghệ này
không thể tương thích với nhau. Chính vì vậy một số hãng đã cung cấp các thiết bị
mạng hybrid cho 802.11a/b nhưng các sản phẩm này chỉ đơn thuần là bổ sung thêm
hai chuẩn này.
Ưu điểm của 802.11a – tốc độ cao; tần số 5Ghz tránh được sự xuyên nhiễu từ
các thiết bị khác.
Nhược điểm của 802.11a – giá thành đắt; phạm vi hẹp và dễ bị che khuất.
Kết nối 802.11g Wi-Fi thế hệ thứ ba. Vào năm 2003, các sản phẩm WLAN hỗ
trợ một chuẩn mới hơn đó là 802.11g, được đánh giá cao trên thị trường. 802.11g thực
hiện sự kết hợp tốt nhất giữa 802.11a và 802.11b. Nó hỗ trợ băng thông lên đến
54Mbps và sử dụng tần số 2.4 Ghz để có phạm vi rộng. 802.11g có khả năng tương
thích với các chuẩn 802.11b, điều đó có nghĩa là các điểm truy cập 802.11g sẽ làm
việc với các adapter mạng không dây 802.11b và ngược lại.
Ưu điểm của 802.11g – tốc độ cao; phạm vi tín hiệu tốt và ít bị che khuất.
Nhược điểm của 802.11g – giá thành đắt hơn 802.11b; các thiết bị có thể bị
xuyên nhiễu từ nhiều thiết bị khác sử dụng cùng băng tần.
Kết nối 802.11n: Wi-Fi thế hệ thứ tư. Năm 2009 một chuẩn mới Wi-Fi được ra mắt
chính là 802.11n. Đây là chuẩn được thiết kế để cải thiện cho 802.11g trong tổng số
băng thông được hỗ trợ bằng cách tận dụng nhiều tín hiệu không dây và các anten
(công nghệ MIMO).
Các kết nối 802.11n sẽ hỗ trợ tốc độ tối đa 600Mb/s (trên thị trường phổ biến có
các thiết bị 150Mb/s, 300Mb/s và 450Mb/s). 802.11n cũng cung cấp phạm vi bao phủ
tốt hơn so với các chuẩn Wi-Fi trước nó nhờ cường độ tín hiệu mạnh của nó. Chuẩn
này có thể hoạt động trên cả hai băng tần 2,4GHz lẫn 5GHz và nếu router hỗ trợ thì hai
băng tần này có thể cùng được phát sóng song song nhau. Thiết bị 802.11n sẽ tương
thích với các thiết bị 802.11g.
Ưu điểm của 802.11n – tốc độ nhanh và phạm vi tín hiệu tốt nhất; khả năng
chịu đựng tốt hơn từ việc xuyên nhiễu từ các nguồn bên ngoài.
Nhược điểm của 802.11n – giá thành đắt hơn 802.11g; sử dụng nhiều tín hiệu
có thể gây nhiễu với các mạng 802.11b/g ở gần.
Kết nối 802.11ac: Wi-Fi thế hệ thứ năm. Chuẩn Wifi thế hệ thứ 5, 802.11ac ra đời
trong năm 2013. So với các chuẩn trước đó, 802.11ac hỗ trợ tốc độ tối đa hiện là
1730Mb/s (sẽ còn tăng tiếp) và chỉ chạy ở băng tần 5GHz. Một số mức tốc độ thấp
hơn (ứng với số luồng truyền dữ liệu thấp hơn) bao gồm 450Mb/s và 900Mb/s.
Về mặt lý thuyết, Wi-Fi 802.11ac sẽ cho tốc độ cao gấp ba lần so với Wi-Fi
802.11n ở cùng số luồng (stream) truyền, ví dụ khi dùng ăng-ten 1x1 thì Wi-Fi ac cho
tốc độ 450Mb/s, trong khi Wi-Fi n chỉ là 150Mb/s. Còn nếu tăng lên ăng-ten 3x3 với
ba luồng, Wi-Fi ac có thể cung cấp 1300Mb/s, trong khi Wi-Fi n chỉ là 450Mb/s. Tuy
nhiên, những con số nói trên chỉ là tốc độ tối đa trên lý thuyết, còn trong đời thực thì
tốc độ này sẽ giảm xuống tùy theo thiết bị thu phát, môi trường, vật cản, nhiễu tín
hiệu...
Hiện nay, hầu hết các router Wi-Fi trên thị trường có hỗ trợ chuẩn 802.11ac sẽ
hỗ trợ thêm các chuẩn cũ, bao gồm b/g/n. Chúng cũng sẽ có hai băng tần 2,4GHz lẫn
5GHz. Đối với những router có khả năng chạy hai băng tần cùng lúc (simultaneous),
băng tần 2,4GHz sẽ được sử dụng để phát Wi-Fi n, còn 5GHz sẽ dùng để phát Wi-Fi
ac.
2.2 Một số loại điều khiển thiết bị thông minh
2.2.1 Điều khiển thiết bị qua webserver
ESP-01 8
ESP-02 8
ESP-03 14
ESP-04 14
ESP-05 5
ESP-06 12+GND
ESP-07 16
ESP-08 14
ESP-08 New 16
ESP-09 12+GND
ESP-10 5
ESP-11 8
ESP-12 16
ESP-12-E 22
ESP-13 18
ESP-14 22
WROOM-02 18
WT8266-S1 18
Hiện tại thì đã có tới 14 phiên bản của ESP8266, quá nhiều sự lựa chọn cho
chúng ta. Nhưng vì ở Việt Nam không phải lúc nào cũng có đủ tất cả nên mình sẽ giới
thiệu 2 phiên bản ESP8266 phổ biến hiện nay. Sau đây là 1 số loại phiên bản thông
dụng:
ESP-01
H
ình 2.10. ESP - 07
Tính năng:
• Tiêu chuẩn wifi: 802.11b/g/n, với tần số 2.4GHz và hổ trợ bảo mật
WPA/WPA2.
• Hổ trợ TCP/UDP.
• Dễ dáng sử dụng với lệnh AT.
• Có 3 chế độ hoạt động: Client, Access Point, Both Client and Access Point.
• Làm việc như các máy chủ có thể kết nối với 5 máy con.
• Khoảng cách giữa các chân 2mm.
Sơ đồ chân
• CH_PD: Kích hoạt chip, sử dụng cho Flash Boot và updating tại module.
Hinh 2.12. Các phiên bản kiến trúc của lõi ARM
Tính đến thời điểm hiện tại thì phiên bản kiến trúc mới nhất của lõi ARM là
ARMv9 (Trước đó có ARMv4, ARMv5, ARMv6,…). Bộ xử lý Cortex-M3 dựa trên
kiến trúc ARMv9 M và có khả năng thực hiện tập lệnh Thumb-2.
Trong CPU Cortex có hai ngăn xếp được gọi là main stack và process
stack.
• Thanh ghi R14 tiếp theo được gọi là thanh ghi liên kết (link register).
Thanh ghi này được sử dụng để lưu trữ các địa chỉ trở về khi một cuộc
gọi thủ tục (call a procedure) được thực hiện. Điều này cho phép CPU
Cortex thực hiện rất nhanh việc nhập và thoát khỏi một thủ tục (fast
entry and exit to a procedure).
• Thanh ghi R15là bộđếm chương trình (Program Counter)
Hình 2.17. Thanh ghi trạng thái chương trình của CPU Cortex
• Năm bit đầu là những cờ mã điều kiện và được gán biệt hiệu (aliased) như
thanh ghi trạng thái chương trình ứng dụng. Bốn cờ N, Z, C, V (Negative,
Zero, Carry và Overflow) sẽ được thiết lập và xóa tùy thuộc vào kết quả của
một lệnh xử lýdữ liệu. Bit Q là được sử dụng bởi các lệnh toán học DPS để chỉ
ra rằng một biến đã đạt giá trị tối đa hoặc giá trị tối thiểu của nó.
• Giống như tập lệnh ARM32-bit, các lệnh Thumb-2 chỉ được thực hiện nếu mã
điều kiện của lệnh phù hợp với trạng thái của các cờ trong thanh ghi trạng thái
chương trình ứngdụng (Application Program Status Register). Nếu mã điều
kiện của lệnh không phù hợp, thì lệnh đi ngang qua đường ống như là một lệnh
NOP (lệnh này không làm gì cả). Điều này đảm bảo rằng các lệnh đi qua đường
ống một cách trơn tru và giảm thiểu làm rỗng đường ống.
2.4.3.4 Các chế độ hoạt động của CPU.
Bộ xử lý Cortex có hai chế độ hoạt động: chế độ Thread và chế độ Handler.
CPU sẽ chạy ở chế độ Thread trong khi nó đang thực thi ở chế độ nền không có ngắt
xảy ra và sẽ chuyển sang chế độ Handler khi nó đang thực thi các ngắt đặc biệt
(exceptions).
Ngoài ra, CPU Cortex có thể thực thi mã trong chế độ đặc quyền hoặc không
đặc quyền (privileged or non-privileged mode). Trong chế độ đặc quyền, CPU có
quyền truy cập tất cả các lệnh. Trong chế độ không co đặc quyền, một số lệnh bị cấm
truy cập (như lệnh MRS và MSR cho phép truy cập vào xPSR và các trường của nó).
Ngoài ra, việc cập các thanh ghi điều khiển hệ thống trong bộ vi xử lý Cortex
cũng bị cấm. Cách sử dụng ngăn xếp (stack) cũng có thể được cấu hình. Ngăn xếp
chính (main stack-R13) có thể được sử dụng bởi cả hai chế độ Thread và Handler.
Chế độ Handler có thể được cấu hình để sử dụng ngăn xếp quá trình (process stack-
R13 banked register).
thi tập lệnh Thumb-2, là một sự pha trộn của lệnh 16-bit và 32-bit. Tập lệnh thumb-2
cải tiến 26% mật độ mã so với tập lệnh ARM 32-bit và 25% hiệu suất so với tập lệnh
Thumb 16-bit. Tập lệnh Thumb2 có một số lệnh nhân được cải tiến, có thể thực hiện
trong một chu kì đơn và khả năng thực hiện phép chia bằng phần cứng và chỉ mất từ 2-
7 chu kỳ.
biến thể STM32 khác nhau và các vi điều khiển dựa trên lõi Cortex của các nhà sản
xuất chip khác.
2.4.4 Kiến trúc hệ thống của ARM CORTEX
ARM Cortex STM32 gồm nhân Cortex kết nối với bộ nhớ FLASH thông qua
đường bus lệnh chuyên biệt. Các bus dữ liệu(Cortex Data busses) và hệ thống (Cortex
System busses) được kết nối tới ma trận busses tốc độ cao( ARM Advanced High
Speed Busses- AHB). SRAM nội kết nối với AHB và đóng vai trò là bộ DMA. Các
thiết bị ngoại vi được kết nối bằng 2 hệ thống bus ngoại vi tốc độ cao ( APB-ARM
Advanced Peripheral Busses).
Các bus APBs thông qua các bus cầu nối AHB-APBs kết nối vào hệ thống
AHB. Ma trận bus AHB sử dụng xung nhịp đồng hồ bằng với xung nhịp của nhân
Cortex. Tuy nhiên thông qua bộ chia tần số AHB có thể hoạt động ở tần số thấp hơn
nhằm tiết kiệm năng lượng.
Điện áp đầu vào định mức là 40V có thể lớn 60V tùy từng dòng Serial
Chỉ giao tiếp với 5 chân đầu vào ra
Tần số đóng cắt chuẩn 52Khz[separator]
Hiệu suất cao
Bảo vệ quá dòng và quá nhiệt.
4 chân OUTPUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với các chân
INPUT) được nối với các chân 2, 3, 13, 14 của L298. Các chân này sẽ được nối
với động cơ.
Hai chân ENA và ENB dung để điều khiển các mạch cầu H trong L298. Nếu ở
mức ogic “1” (nối với nguồn 5V) thì cho phép mạch cầu H hoạt động, nếu ở
mức logic “0” thì mạch cầu H không hoạt động.
Rơ le điện từ.
Rơ le điện động.
Rơ le từ điện.
Rơ le cảm ứng.
Rơ le nhiệt.
Rơ le bán dẫn và vi mạch.
Phân loại theo vai trò và đại lượng tác động:
Rơ le trung gian.
Rơ le thời gian.
Rơ le nhiệt.
Rơ le tốc độ.
Rơ le dòng điện.
Rơ le công suất…
Phân loại theo dòng điện:
Rơ le dòng điện một chiều.
Rơ le dòng điện xoay chiều.
Phân loại theo giá trị và chiều của đại lượng đi vào rơ le:
Rơ le cực đại.
Rơ le cực tiều.
Rơ le sai lệch.
Rơ le hướng.
Rơ le 10A
Nguồn
Hình 3.3. Mạch ghép nối thạch anh cho vi điều khiển
PHỤ LỤC
size=\"6\" color=\"black\">Starts/Stop</font></button></a> <a
href=\"?pin=Left\"><button><font size=\"6\"
color=\"yellow\">left</font></button></a><font size=\"6\">"};
int main()
{
uint32_t i,k=0,pwm,duty_new;
IO_config();
GPIO_SetBits(GPIOA,GPIO_Pin_12);
GPIO_SetBits(GPIOA,GPIO_Pin_13);
usart1_init(GPIOA, GPIO_Pin_9, GPIO_Pin_10, 115200);
usart2_init(GPIOA, GPIO_Pin_2, GPIO_Pin_3, 115200);
UART1_2_IRQn();
if (SysTick_Config(SystemCoreClock / 1000000))
{
/* Capture error */
while (1){}
}
Delay_ms(1000);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
CH_Timer_GPIO_Configuration(GPIOA, GPIO_Pin_6);
PWM_timer_init(TIM3, 3999, 36);
PWM_CH1(TIM3,4000);
ESP_AT(uart2);
Delay_ms(1000);
Send_Data(1);
ESP_RST(uart2);
Delay_ms(1000);
Send_Data(1);
ESP_CWMODE(uart2,3);
Delay_ms(1000);
Send_Data(1);
ESP_CWJAP(uart2,"FPT Telecom","12345678");
Delay_ms(1000);
Send_Data(1);
ESP_CIPSTA(uart2);
Send_Data(1);
Delay_ms(1000);
ESP_CIPMUX(uart2,1);
Send_Data(1);
Delay_ms(1000);
ESP_CIPSERVER(uart2);
Send_Data(1);
Delay_ms(1000);
ESP_CIPSTO(uart2,10);
Send_Data(1);
Delay_ms(1000);
ESP_CIFSR(uart2);
Send_Data(1);
Delay_ms(1000);
target = 0;
i=0;
k=0;
while(buf1[i]!='\0')
{
if(buf1[i]!='\\')
{
k++;
i++;
}
}
printf("buf1=
%d\r\n",i);/////////////////////////////////////////
i=0;
while(buf2[i]!='\0')
{
if(buf2[i]!='\\')
{
k++;
i++;
}
}
printf("buf2=
%d\r\n",i);/////////////////////////////////////
i=0;
while(buf3[i]!='\0')
{
if(buf3[i]!='\\')
{
k++;
i++;
}
}
printf("buf3=
%d\r\n",i);///////////////////////////////////
i=0;
while(buf_TB1[i]!='\0')
{
if(buf_TB1[i]!='\\')
{
k++;
i++;
}
}
printf("buf_TB1=%d\r\n",i);////////////////////////////
i=0;
while(buf_TB2[i]!='\0')
{
if(buf_TB2[i]!='\\')
{
k++;
i++;
}
}
printf("buf_TB2=
%d\r\n",i);////////////////////////////////
i=0;
while(Startur_on[i]!='\0')
{
if(Startur_on[i]!='\\')
{
k++;
i++;
}
}
printf("Startur_on=
%d\r\n",i);/////////////////////////////
i=0;
while(Startur_off[i]!='\0')
{
if(Startur_off[i]!='\\')
{
k++;
i++;
}
}
printf("Startur_off=
%d\r\n",i);///////////////////////////
i=0;
while(buf_DC[i]!='\0')
{
if(buf_DC[i]!='\\')
{
k++;
i++;
}
}
printf("buf_DC=%d\r\n",i);////////////////////
i=0;
while(Startur_off[i]!='\0')
{
if(Startur_off[i]!='\\')
{
k++;
i++;
}
}
printf("Startur_off=%d\r\n",i);///////////
i=0;
while(buf_up_dow[i]!='\0')
{
if(buf_up_dow[i]!='\\')
{
k++;
i++;
}
}
printf("buf_up_dow=%d\r\n",i);
printf("kkkkkkkkkkkkkkkkkkkkk=%d\r\n",k);
number_word=k;
while(1)
{
//kiem tra truy cap web
if(pwm_new==1)
{
pwm_new=0;
duty_new=100-duty;
pwm = (4000*duty_new)/100;
target=0;
printf("pwm=%d\r\n",pwm);
PWM_CH1(TIM3,pwm);
}
if(contro==1)
{
printf("tb_connect = %c\r\n",tb_connect);
contro=0;
CheckState();
}
}
}
void IO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO,
ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|
GPIO_Pin_7);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void CheckState(void)
{
//GPIO_ResetBits(GPIOA,GPIO_Pin_13);
if((startur_PIN1==1)&&(startur_PIN2==1))
{
if(startur_PIN_Stop==0)
{
if(startur_PIN_Left_Righ==1)
{
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_on,buf_DC,Startur_Righ,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_on,buf_DC,Startur_Left,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_on,buf_DC,Startur_Stop,buf_up_dow,duty);
}
else if((startur_PIN1==1)&&(startur_PIN2==0))
{
if(startur_PIN_Stop==0)
{
if(startur_PIN_Left_Righ==1)
{
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_off,buf_DC,Startur_Righ,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_off,buf_DC,Startur_Left,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_on,buf_TB2,Start
ur_off,buf_DC,Startur_Stop,buf_up_dow,duty);
}
else if((startur_PIN1==0)&&(startur_PIN2==0))
{
if(startur_PIN_Stop==0)
{
if(startur_PIN_Left_Righ==1)
{
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_off,buf_DC,Startur_Righ,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_off,buf_DC,Startur_Left,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_off,buf_DC,Startur_Stop,buf_up_dow,duty);
}
else if((startur_PIN1==0)&&(startur_PIN2==1))
{
if(startur_PIN_Stop==0)
{
if(startur_PIN_Left_Righ==1)
{
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_on,buf_DC,Startur_Righ,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_on,buf_DC,Startur_Left,buf_up_dow,duty);
}
else
Show_Web(number_word,buf1,buf2,buf3,buf_TB1,Startur_off,buf_TB2,Star
tur_on,buf_DC,Startur_Stop,buf_up_dow,duty);
}
}
void GPIO_Configuration_Output(GPIO_TypeDef* GPIOx, int GPIO_Pin)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(GPIOx == GPIOA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
if(GPIOx == GPIOE)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
if(GPIOx == GPIOC)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
if(GPIOx == GPIOD)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
if(GPIOx == GPIOG)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
void GPIO_Configuration_Input(GPIO_TypeDef* GPIOx, int GPIO_Pin)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(GPIOx == GPIOA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
if(GPIOx == GPIOE)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
if(GPIOx == GPIOC)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
if(GPIOx == GPIOD)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
if(GPIOx == GPIOG)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
void UART1_2_IRQn(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
index = ms*1010;
while(index)
{
index--;
}
}
void Delay_us(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0){}
}
void Delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime*1000;
while(TimingDelay != 0){}
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
void Send_Data(unsigned char Port_Usart)
{
uint32_t jn;
//target = Port_Usart - 1;
if(Port_Usart==1)
{
for(jn=0; jn<1000; jn++)
{
usart_send_data(USART1, DATA_ESP[jn]);
}
}
else if(Port_Usart==2)
{
else check_Data = 0;
}
target=0;
printf("\n");
for(jj=0;jj<(Length_Data-1);jj++)
{
usart_send_data(USART1, Flag_Data[jj]);
}
jj=0;
while(filer_Data[jj] !='\0')
{
usart_send_data(USART1, filer_Data[jj]);
jj++;
}
}
void USART1_IRQHandler(void)
{
volatile unsigned int IIR;
uint8_t c1;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Neu co ky
tu moi trong bo dem nhan
{
IIR = USART1->SR;
c1=usart1_get_data();
if(index_usart < 1000)
{
data_sms[index_usart++] = c1;
}
else
{
index_usart = 0;
}
}
}
void USART2_IRQHandler(void)
{
volatile unsigned int IIR;
uint8_t c2;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // Neu co ky
********************************************************************
********/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
/*
--------------------------------------------------------------------
---------------------------------
*
* TIMx Configuration: generate 1 PWM signals:
* APB1 prescaler = 72 # 1 => TIMxCLK = PCLK1x2 = 2 MHz,
Prescaler = 0x0 => TIMx counter clock = 2 MHz
* TIMx ARR Register = 4096 => TIMx Frequency = TIMx counter
clock/(ARR + 1)
* TIMx Frequency = 488.1620698Hz.
* TIMx Channel2 duty cycle = (TIMx_CCR2/ TIMx_ARR)* 100 = 50%
* TIMx Frequency = TIMx counter clock/(TIM_Period + 1)
* Prescaler la gia tri de chia tu tan so he thong thanh gia
tri can lay dua vao co timer
* Period la gia tri cua 100% xung PWM tao ra duoc va ti le
phan tram xung (%) = (gia tri tu thanh ghi CCR)/Period
--------------------------------------------------------------------
---------------------------------- */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|
RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseStructure.TIM_Period = Period;
TIM_TimeBaseStructure.TIM_Prescaler = Prescaler-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
TIM_OC1Init(TIMx, &TIM_OCInitStructure);
TIM_OC2Init(TIMx, &TIM_OCInitStructure);
TIM_OC3Init(TIMx, &TIM_OCInitStructure);
TIM_OC4Init(TIMx, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIMx, ENABLE);
{
i--;
}
}
void _Delay_us_mem(__IO uint32_t us)
{