|
|||||
Chapter 3 problems |
- B3.1 - |
Designing a wind compass (μC - C) |
| ||
|
1. Specifications
We want to design a digital wind direction meter (wind_compass) based on a 16-position optoelectronic rotary encoder as shown in Fig. 1 using a PIC18F4520.
The same project is proposed in D1.1 as a combinational circuit based on logic gates.
Fig. 1. Circuit symbol and its realisation in Proteus wind_compass.pdsprj for better comprehending how does it works. |
Fig. 2 represents the wind compass subdivided in 16 directions each of which is assigned to a 4-bit Gray code.
Fig. 2. Wind compass describing the sixteen principal bearings used to measure wind direction and an example of commercial manufactured wind transducer. |
Fig. 3 represents the sensor disk coded in Gray, which is used instead of binary radix-2 code to prevent spurious outputs from electromechanical switches. The objective is to develop the VHDL code and the final circuit to be synthesised into a target complex programmable device (CPLD) or a field programmable gate array (FPGA) chip.
Fig. 3. Gray code's error reduction with encoders (ref.) Adjacent codes differentiate themselves by only one bit. |
Fig. 4. Sensor codes assigning for instance the code "0000" to the NNW direction. |
Some questions to organise the project:
- Write the truth table of the wind_compass. The inputs have to be ordered in this way: E, D(3..0).
Fig. 5.Wind compass circuit and truth table. |
- Use the following pin connections:
D3 --> RA0; D2 --> RA1; D1 --> RA2; D0 --> RA3
Y(15..8) --> RB(7..0); Y(7..0) --> RD(7..0)
E --> RC7
S(6..0) --> RC(6..0)
- List all the RAM variables involved in this design.
From a simiar tutorial in P9 or LAB9 where to copy and adapt to the project location folder:
- Draw an sketch of the hardware circuit and capture it in Proteus wind_compass.pdsprj
- Write the software source file wind_compass.c. Start an MPLABX - XC8 project targeted to the PIC18F4520 chip. Use our software organisation.
As we have decided, start compiling and testing one input or output at a time:
- Write the funcion init_system(). Start configuring only one input, compile and test. Describe using pictures and annotations how you are configuring registers.
- Write the funcion read_inputs(). Start reading only one input, compile and test. Describe using pictures and annotations how you are reading an input using bitwise C instructions.
- Write the funcion write_outputs(). Start writing only one output, compile and test. Describe using pictures and annotations how you are writing a RAM variable in the corresponding pin using bitwise C instructions.
- Translate the truth table to C code and complete truth_table().
- Check the full project and report.